Создать структуру родительско-дочернего массива на основе сравнения значений

Я пытаюсь создать структуру «массив в массиве», основанную на значении каждой записи, и я действительно не знаю, как мне подходить к этому.

Я надеюсь, что кто-то из SO может помочь мне добиться этого эффективно.

Вещи, которые я пробовал до сих пор: установка родителей и добавление детей, затем то же самое для каждого из детей.

Входные данные:

array(
array('value' => 0),
array('value' => 4),
array('value' => 4),
array('value' => 8),
array('value' => 0),
array('value' => 4)
)

Требуемый выход

array(
array('value' => 0
'children' => array(
array('value' => 4),
array('value' => 4
'children' => array(
array('value' => 8)
)
)
)
),
array('value' => 0
'children' => array(
array('value' => 4)
)
)
)

Буду признателен за любые идеи. Я думаю о рекурсивном методе для достижения этой цели, однако я не знаю, как это сделать правильно.

Заранее большое спасибо!

0

Решение

function doit(&$a , &$i)
{
$myval = $a[$i++]['value'];
$chld = array();
while( isset($a[$i]) && $a[$i]['value']>$myval )
{
$chld[]=doit($a ,$i);
}
if(count($chld)>0)
return array('value'=>$myval,'children'=>$chld);
else
return array('value'=>$myval);
}

$a = array(
array('value' => 0),
array('value' => 4),
array('value' => 4),
array('value' => 8),
array('value' => 0),
array('value' => 4)
);

$i=0;
$result = array();
while(isset($a[$i]))
$result[] = doit($a,$i);
print_r($result);

Обратите внимание, что указатель $ i передается как ссылка, это означает, что он является одной и той же переменной во всех рекурсивных вызовах, всегда указывая на следующую необработанную запись.

Один запуск функции doit () обработает одно значение, а затем (при наличии дочернего кандидата) будет рекурсивно вызывать себя для каждого из своих дочерних элементов.

1

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

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

По вопросам рекламы [email protected]