Создать ассоциативный массив рекурсивно в php — & quot; works & quot; с эхом

У меня есть база данных с модулями и подмодулями.

Функция getChildren() должен вернуть связь между ними для создания элемента навигации:

public function getChildren($id=0) {
$modulesResult = $this->find('all', array(
'conditions' => array('parent' => $id)
));
echo "<ul>";
foreach ($modulesResult as $key => $value) {
echo "<li>";
echo $value['module']['id'].". ".$value['module']['modulename'];
$this->getChildren($value['module']['id']);
echo "</li>";
}
echo "</ul>";
}

Который производит следующий вывод:

1. Calendar
2. Mailbox
3. Statistics
15. Local Statistics
16. Regiona Sstatistics
17. Global Statistics
18. Custom Statistical Reports
4. Production
19. Current Production
22. Sort By Product
23. Create Product
24. List Products
20. Production History
25. From-To
26. Yearly
27. Monthly
21. Projections
28. Analysis
5. Trade
29. E-store
30. Products
32. List Products
33. Create Product
34. Sort By Product
31. Dashboard

Я хочу сделать то же самое, но вместо эха, Я хочу поместить все в ассоциативный массив.

Я попробовал это:

public function getChildrenTest($id=0, $array=array()) {
pr($array);
$modulesResult = $this->find('all', array(
'conditions' => array('parent' => $id)
));
foreach ($modulesResult as $key => $value) {
#echo $value['module']['id'].$value['module']['modulename']."<br>";
$array[$value['module']['parent']][$value['module']['id']] = $value['module']['modulename'];
$this->getChildrenTest($value['module']['id'], $array);
}
return $array;
}

Но он выводит только первый уровень, например так:

Array
(
[0] => Array
(
[1] => Calendar
[2] => Mailbox
[3] => Statistics
[4] => Production
[5] => Trade
)
)

Я попробовал несколько вариантов кода выше, но ничего не работает! Кажется застрял!

Я теряю некоторую информацию о рекурсии?

0

Решение

Попробуйте следующее:

public function getChildren($id=0) {
$modulesResult = $this->find('all', array(
'conditions' => array('parent' => $id)
));

$array=[];
foreach ($modulesResult as $key => $value) {

$array[$value['module']['id']]=array(
$value['module']['modulename']=>$this->getChildren($value['module']['id'])
);
}

return $array;
}

Или вы можете также использовать find('threaded')Средство поиска, которое CakePHP предоставляет для работы с вложенными результатами:

$modulesResult = $this->find('threaded',['parent'=>'parent']);

Что равно:

$modulesResult = $this->find('all');
$modulesResult = Hash::nest($modulesResult,['parentPath'=>'{n}.module.parent']);

Увидеть:

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector