基于值比较创建父子数组结构


Create parent-child array structure based on value comparison

我正试图根据每个条目的值创建一个数组中的数组结构,但我真的不知道该如何处理。

我希望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()函数将处理它的一个值,然后(只要有子候选者)将为它的每个子递归地调用它自己。