Я пытаюсь создать структуру «массив в массиве», основанную на значении каждой записи, и я действительно не знаю, как мне подходить к этому.
Я надеюсь, что кто-то из 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)
)
)
)
Буду признателен за любые идеи. Я думаю о рекурсивном методе для достижения этой цели, однако я не знаю, как это сделать правильно.
Заранее большое спасибо!
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 () обработает одно значение, а затем (при наличии дочернего кандидата) будет рекурсивно вызывать себя для каждого из своих дочерних элементов.
Других решений пока нет …