Вложенный список из двумерного массива - PullRequest
0 голосов
/ 01 декабря 2018

Я хочу создать вложенный список в HTML (с ul и li) из двумерного массива.

Массив выглядит так:

myArray["1"]["name"] -> Apple
myArray["1"]["parent"] -> 2
myArray["2"]["name"] -> Fruits
myArray["2"]["parent"] -> 3
myArray["3"]["name"] -> Food
myArray["3"]["parent"] -> (empty)
myArray["4"]["name"] -> Water
myArray["4"]["parent"] -> 5
myArray["5"]["name"] -> Drinks
myArray["5"]["parent"] -> (empty)
myArray["6"]["name"] -> Milk
myArray["6"]["parent"] -> 5

А теперь яхочу найти все эти отношения (также больше слоев) и отобразить их с элементами списка HTML:

    $allObjects = db_getAll();

    function r($parent, $arrayAllObjects){

        foreach ($arrayAllObjects as $object) {
            if ($object["parent"]==$parent) {
                return ("<ul>".$object["name"]."<li>". r($object["ID"], $arrayAllObjects)."</li></ul>");
            }
        }
    }


    echo r("0", $allObjects);

Все начинается хорошо, и первая "ветка / рука" отображается отлично, но после этого (первый лист вконец) он останавливается: (

Текущий результат:

 -Food
  -Fruits
   -Apple

Отсутствует:

 -Drinks
  -Water
  -Milk
 -Example
  -Test
   -Test
   -...
 -...

Что я забыл?

Спасибо вам такмного!

1 Ответ

0 голосов
/ 01 декабря 2018

Проблема в том, что после обработки первого элемента на базовом слое вы затем return внутри цикла foreach, что означает, что он не пойдет на дальнейшие элементы.

Вместо этого вам нужносоздать все выходные данные и вернуть их из конца функции ...

function extractLayer($parent, $arrayAllObjects){
    $output = "";
    foreach ($arrayAllObjects as $object) {
        if ($object["parent"]==$parent) {
            $subLayer = extractLayer($object["ID"], $arrayAllObjects);
            if ( !empty($subLayer) )    {
                $output .="<ul>".$object["name"].$subLayer."</ul>";
            }
            else    {
                $output .= "<li>".$object["name"]."</li>";
            }
        }
    }
    return $output;
}

echo extractLayer("0", $allObjects);

Я также изменил имя функции, так как r неочевидно.

Просто обновил это, поскольку каждый лист также строил свой собственный список, даже если не было подслоев.Таким образом, это проверяет подслои и, если их нет, просто помещает элемент в теги <li>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...