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!
Co twoja tablica wygląda? Może to dotyczyć wrażeń przypominających rekursję. –
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
@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? –