2015-07-03 9 views
5

Oto co mam http://codepad.org/iDoXXsLXz PHP tablicy wielowymiarowej próbuje tworzyć zagnieżdżone menu ul Li (nieograniczona liczba poziomów zagnieżdżonych)

Have array jak ten

Array 
(
[0] => Array 
    (
     [NumberRenamed] => 17 
     [TopicName] => Products 
     [UpperLevelNumberRenamed] => 0 
    ) 

[17] => Array 
    (
     [0] => Array 
      (
       [1] => Array 
        (
         [NumberRenamed] => 18 
         [TopicName] => Computers 
         [UpperLevelNumberRenamed] => 17 
        ) 
      ) 
    ) 

[18] => Array 
    (
     [0] => Array 
      (
       [2] => Array 
        (
         [NumberRenamed] => 16 
         [TopicName] => Laptops 
         [UpperLevelNumberRenamed] => 18 
        ) 
      ) 
    ) 

[16] => Array 
    (
     [0] => Array 
      (
       [4] => Array 
        (
         [NumberRenamed] => 8 
         [TopicName] => Dell 
         [UpperLevelNumberRenamed] => 16 
        ) 
      ) 
    ) 
) 

Top poz poziom jest Products, najpierw sub poz poziom jest Computers, obok niższego poziomu jest Laptops, a następnie ponownie następnego niższego poziomu Dell

Dla każdego elementu niższego poziomu UpperLevelNumberRenamed == do najbliższego górnym poziomie NumberRenamed.

Chcesz uzyskać wynik jak ten

Products 
    Computers 
    Laptops 
     Dell 
     Acer 
    Desktops 
Home 

próbował tego

foreach($main_topics as $k_main_topics => $v_main_topics){ 

if(isset($v_main_topics['UpperLevelNumberRenamed']) and $v_main_topics['UpperLevelNumberRenamed'] == 0){ 
//print only top level topics 
echo $v_main_topics['TopicName']. '<br/>'; 
} 

else{//if not top level topic 

foreach($v_main_topics[0] as $k_v_main_topics_0 => $v_v_main_topics_0){ 
echo $v_v_main_topics_0['TopicName']. '<br/>'; 
}//foreach($v_main_topics[0] as $k_v_main_topics_0 => $v_v_main_topics_0) 

}//else{ 

}//foreach($main_topics as $k_main_topics => $v_main_topics) 

Ale dostać ten

Products 
Home 
Computers 
Laptops 
Desktops 
Dell 
Acer 

Coś nieprawidłowy, ale nie mogę zrozumieć, co. Proszę o porady, co należy poprawić/zmienić w kodzie

Próbując Innym sposobem

początkowy tablicy jest tablica wymiarowa. Próbuję uzyskać nawigację uliczną z jednego wymiaru.

Oto co zrobiłem http://codepad.org/OLtxyL4X

+0

Czy te liczby naprawdę coś znaczy ?? Innymi słowy, czy odzwierciedlają one identyfikator bazy danych? Poza tym, dlaczego gniazdowania dodatkowy poziom '[17] => Array ( [0] => Array (' '[18] => Array ( [0] => Array ('. .... czy naprawdę tego potrzebujesz? – KAD

+0

Tak, numery są kluczami podstawowymi - identyfikator bazy danych. Poziom dodatkowy jest wykonany, ponieważ ta odpowiedź była następująca: http://stackoverflow.com/questions/7673044/nested-array-third-level-is -disappearing/7673415 # 7673415 Teraz pojawia się, że nie potrzebujesz dodatkowego poziomu – user2118559

Odpowiedz

4

Oto podsumowanie tego, co robi:

  • spłaszczyć tablicy rekursywnie
  • zbudować wielowymiarowy związku mapę
  • stworzyć 1D relacje, które łączą UpperLevelNumberRenamed do NumberRenamed
  • wydrukuj wielowymiarowo jako listę ul-li.

Oto ona:

$flat = array(); 
foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($main_topics)) as $i) 
    $flat[] = $i; 
$final = array(); 
$defs = array(); 
for ($i = 0; $i < count($flat); $i += 3) 
    if ($flat[$i + 2] == 0) { 
     $final[$flat[$i + 1]] = array(); 
     $defs[$flat[$i]] = &$final[$flat[$i + 1]]; 
    } else { 
     $defs[$flat[$i + 2]][$flat[$i + 1]] = array(); 
     $defs[$flat[$i]] = &$defs[$flat[$i + 2]][$flat[$i + 1]]; 
    } 

function array2ul($array) { 
    $out = "<ul>"; 
    foreach($array as $key => $elem) 
     $out = is_array($elem) ? 
     $out . "<li><span>$key</span>" . array2ul($elem) . "</li>" : 
     $out = $out."<li><span>$key:[$elem]</span></li>"; 
    $out = $out . "</ul>"; 
    return $out; 
} 

echo array2ul($final); 

Output:

<ul><li><span>Products</span><ul><li><span>Computers</span><ul><li><span>Laptops</span><ul><li><span>Dell</span><ul></ul></li><li><span>Acer</span><ul></ul></li></ul></li><li><span>Desktops</span><ul></ul></li></ul></li></ul></li><li><span>Home</span><ul></ul></li></ul>

+0

@ user2118559 Sprawdź tę zaktualizowaną odpowiedź, teraz jest to lista ul-li Zobacz, czy to jest lepsze –

+0

Tak, bardzo dobry wynik, dziękuję (dostań to, czego się spodziewałeś) Będę musiał zrozumieć kod krok po kroku Moja wiedza jest w tej chwili zbyt słaba ... – user2118559

+0

Jak rozumiem w '$ i + = 3'' 3' to liczba elementów wewnątrz każdego subarray. Próbowałem zmodyfikować i dodać jeszcze jeden element. Oto wynik https://eval.in/391531 wydaje się popełniony błąd – user2118559

0

To będzie przykład roboczych za pomocą rekurencji, nie badano jednak:

Zdefiniuj tablicę

$main_array = Array 
    (
     '10' => Array 
     (
      'name' => 'Products' 
      'children' => Array 
      (
       '12' => Array 
       (
        'name' => 'Laptop', 
        'children' => Array 
        (

         '13' => Array 
         (
          'name' => 'Dell', 
         ), 
         '14' => Array 
         (    
          'name' => 'Acer', 
         ) 
        ) 
       ) 
       '14' => Array 
       (
        'name' => 'Desktop', 
        'children' => Array 
        (

         '15' => Array 
         (
          'name' => 'Sony', 
         ), 
         '16' => Array 
         (    
          'name' => 'Apple', 
         ) 
        ) 
       ), 
      ) 

     ) 
    ) 

utworzyć i wywołać funkcję:

function createList($main_topics) 
     { 
      if($main_topics == null || sizeof($main_topics) <= 0) 
      { 
       return ''; 
      } 

      $list = '<ul>'; 
      foreach($main_topics as $k_main_topics => $v_main_topics) 
      { 

       $list .= '<li id="' . $k_main_topics'"> '. $v_main_topics['name'] . ' ' . createList(isset($v_main_topics["children"]) ? $v_main_topics["children"] : null) . '</li>' ; 

      } 

      $list .= '</ul>'; 

      return $list; 

     } 

     echo createList($main_array); 
Powiązane problemy