2011-07-25 15 views
5

Użyłem następującego stackoverflow thread, który był bardzo pomocny przy tworzeniu posortowanej wielopoziomowej macierzy nadrzędnej-> podrzędnej.Tworzenie pojedynczego SELECT przy użyciu wielopoziomowej macierzy nadrzędnej> podrzędnej

poniżej jest przykładem wielopoziomowego (3 poziomy) nadrzędnej> dziecko posortowanej tablicy podstawie sortowania sposobu wspomnianego powyżej gwintu:

Array 
( 
    [1] => Array 
     ( 
      [name] => User Manual 
      [parentId] => 0 
      [children] => Array 
       ( 
        [2] => Array 
         ( 
          [name] => Users 
          [parentId] => 1 
          [children] => Array 
           ( 
            [4] => Array 
             ( 
              [name] => Privileges 
              [parentId] => 2 
             ) 
           ) 
         ) 
        [3] => Array 
         ( 
          [name] => Reference 
          [parentId] => 1 
          [children] => Array 
           ( 
            [5] => Array 
             ( 
              [name] => Glossary 
              [parentId] => 3 
             ) 
            [6] => Array 
             ( 
              [name] => Index 
              [parentId] => 3 
             ) 
           ) 
         ) 
       ) 
     ) 
) 

Teraz chcieliby wykorzystać tę posortowanej tablicy i wygenerować pojedynczy HTML SELECT, który wyświetla i reprezentuje> nadrzędnej struktury dziecko, jak na poniższym przykładzie:

<option value='1'>User Manual</option> 
<option value='2'>User Manual -> Users</option> 
<option value='4'>User Manual -> Users -> Privileges</option> 
<option value='3'>User Manual -> Reference</option> 
<option value='5'>User Manual -> Reference -> Glossary</option> 
<option value='6'>User Manual -> Reference -> Index</option> 

celem jak widać powyżej jest kompilacja ciąg wyświetlacza, który reprezentuje wielopoziomowego rodzic/dziecko ścieżka dla każdej pozycji. Wartość VALUE każdej opcji jest ostatnią pozycją w reprezentowanym skompilowanym łańcuchu. Tak więc dla opcji "Podręcznik użytkownika -> Użytkownicy -> Uprawnienia" VALUE jest identyfikatorem uprawnień, ale tekst wyświetlany reprezentuje jego relację rodzic/dziecko w tablicy.

select tworzę zawsze kończy się wyświetleniem listy opcji jak poniżej:

<option value='1'>User Manual</option> 
<option value='2'>User Manual -> Users</option> 
<option value='4'>Users -> Privileges</option> 
<option value='3'>User Manual -> Reference</option> 
<option value='5'>Reference -> Glossary</option> 
<option value='6'>Reference -> Index</option> 

Widać, że to tylko jest w stanie śledzić jednego poziomu relacji rodzic/dziecko.

Moja funkcja, która przetwarza tablicę stworzyć listę opcji zaznaczane jest następujący:

function buildOptions($arr, $target, $parent = NULL) { 
    $html = ""; 
    foreach ($arr as $key => $v) 
    { 
    if (array_key_exists('children', $v)) 
    { 
     if ($key == $target) 
     $html .= "<option value='$key' selected>$parent {$v['name']}</option>\n"; 
     else 
     $html .= "<option value='$key'>$parent {$v['name']}</option>\n"; 

     $html .= buildOptions($v['children'],$target,$v['name']." > "); 
    } 
    else if ($key == $target) 
     $html .= "<option value='$key' selected>$parent {$v['name']}</option>\n"; 
    else 
     $html .= "<option value='$key'>$parent {$v['name']}</option>\n"; 

    } 

    return $html; 
} 

Mam problemy w śledzenie poprzedniego X parent.name gdy istnieje więcej niż jeden poziom. Każda pomoc tutaj byłaby mile widziana. Dziękuję Ci!

+2

Co twoja tablica wygląda? Może to dotyczyć wrażeń przypominających rekursję. –

+0

Twoje prawo, używam rekursji, aby wyświetlić 2 poziomy, więc problem, który mam, jest utrzymywany w historii struktury drzewa przez dwa poziomy. Problem polega na tym, że rekursja działa poprzez wstępnie posortowaną tablicę. Zajmuje się każdym dzieckiem i naturalnie, w miarę rozwoju dziecka. Więc kiedy cofa się do poprzedniego dziecka, mam trudny konceptualizacji, cofając ciąg. Mam nadzieję, że ma to sens. Zaktualizuję swój post za pomocą przykładu tablicowego. – Brad

+0

@Brad: W Twoim fragmencie nie ma rekursywnego połączenia. Co to jest 'TOUL'? Co to jest 'cel $'? Czy rozważysz użycie wizualnych wskaźników (wcięcia) zamiast powtarzania pełnej ścieżki wyrażania hierarchii? –

Odpowiedz

3

Poprawianie rekurencyjne wywołanie w ten sposób, i powinieneś dostać pełną hierarchię na każdym węźle:

function buildOptions($arr, $target, $parent = NULL) { 
    $html = ""; 
    foreach ($arr as $key => $v) 
    { 
    if ($key == $target) 
     $html .= "<option value='$key' selected>$parent {$v['name']}</option>\n"; 
    else 
     $html .= "<option value='$key'>$parent {$v['name']}</option>\n"; 

    if (array_key_exists('children', $v)) 
     $html .= buildOptions($v['children'],$target,$parent . $v['name']." > "); 
    } 

    return $html; 
} 
+0

Dzięki! Nie mogę uwierzyć, że byłem tak blisko. Człowieku .. i mogę przysiąc, że próbowałem tego. Zbyt wiele godzin wpatrywania się w ten sam problem, jak sądzę. – Brad

+0

Nie mogę jeszcze dodawać własnych odpowiedzi jako kontynuacji, ale nieznacznie zmodyfikowałem twoją odpowiedź, aby sprawdzić czy (! $ Parent), a następnie wydrukuj tylko $ v ['name']. "->", else print $ parent. $ v ['name']."->". – Brad

+1

Po prostu: jeśli gapię się zbyt długo na problem, po prostu wstaję i odchodzę ... może powąchać trochę świeżego powietrza na zewnątrz. 1-2 godziny później zwykle rozwiązuję problem w ciągu 10 minut. To działało dla mnie. :) –

Powiązane problemy