Как пройти массив PHP с BFS с модификациями

Hell0 кодеры. Я пытаюсь пройти через несколько массивов BFS и изменить массив. Как это сделать? Мой фрагмент с bfs находится в разделе ниже. Это итерирует массив, но я не могу сохранить изменения (я добавил несколько комментариев в коде).

   /**
* @param array $tree
* @param callable $callable
* @return array
*/
function bfs($tree, $callable)
{
$mn = function($item) use($callable) {
// preserve items for array traverse
return $callable($item) + ['items' => $item['items']];
};
$queue = new \SplQueue();
$start = $tree[0];
$queue->enqueue($start);
$visited = [$start['id']];
while ($queue->count()) {
$node = $queue->dequeue();
foreach ($node['items'] as $item) {
if (!in_array($item['id'], $visited)) {
$visited[] = $item['id'];
$queue->enqueue($item);
$item = $mn($item); // I need save modifications here
}
}
$node = $mn($node); // I need save modifications here
}
return $tree;
}

Мой упрощенный ввод:

[
0 => [
'id' => '1'
'left_id' => '1'
'right_id' => '8'
'depth' => '0'
'name' => 'Page level 1'
'items' => [
0 => [
'id' => '4'
'left_id' => '2'
'right_id' => '5'
'depth' => '1'
'name' => 'Page level 1.1'
'items' => []
]
]
]
]

Мой вывод должен быть чем-то вроде этого:

[
0 => [
'label' => 'Page level 1'
'items' => [
0 => [
'label' => 'Page level 1.1'
'items' => []
]
]
]
]

Постскриптум Основная проблема заключается в выталкивании / вставке элемента в массив.

<?
$start = '23';
$queue = [];
// array_push($queue, &$start); causes Fatal error
array_push($queue, $start);
$start2 = array_pop($queue); // I need get reference to $start
$start2 = '24';
echo $start; // needed result shoud be 24, i.e. to change $start by reference

2

Решение

Кто-то написал, но вскоре удалил решение. Тем не менее, спасибо человеку! Оно работает

<?
public function handleTree(&$array, $callback)
{
foreach ($array as &$item) {
handleTree($item['items'], $callback);
$item = $callback($item) + ['items' => $item['items']];
}
}
0

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

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

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