使用PHP将2d数组转换为3d

时间:2010-09-30 02:45:49

标签: php arrays tree

有一些简单的2d数组,其中包含某种类型的树:

  • node1上
    • 节点2
      • 节点3

它的结构是:

array(
    array (
      'id' : 1,
      'pid': 0,
      'title' : 'node1',
      'level' : 1
    ),
    array (
      'id' : 2,
      'pid': 1,
      'title' : 'node2',
      'level' : 2
    ),
    array (
      'id' : 3,
      'pid': 2,
      'title' : 'node3',
      'level' : 3
    ),
)

是否有PHP解决方案将此数组转换为:

array(
    array (
      'id' : 1,
      'title' : 'node1',
      'child' :  array (
                   'id' : 2,
                   'title' : 'node2',
                   'child' :  array (
                                 'id' : 3,
                                 'title' : 'node3',
                              ),
                 ),

    )
 ...
)

2 个答案:

答案 0 :(得分:1)

找到@SO PHP Traversing Function to turn single array into nested array with children - based on parent id

$inArray = array(
    array('ID' => '1', 'parentcat_ID' => '0'),
    array('ID' => '2', 'parentcat_ID' => '0'),
    array('ID' => '6', 'parentcat_ID' => '1'),  
    array('ID' => '7', 'parentcat_ID' => '1'),
    array('ID' => '8', 'parentcat_ID' => '6'),          
    array('ID' => '9', 'parentcat_ID' => '1'),  
    array('ID' => '13', 'parentcat_ID' => '7'),
    array('ID' => '14', 'parentcat_ID' => '8'),     
);

function makeParentChildRelations(&$inArray, &$outArray, $currentParentId = 0) {
    if(!is_array($inArray)) {
        return;
    }

    if(!is_array($outArray)) {
        return;
    }

    foreach($inArray as $key => $tuple) {
        if($tuple['parentcat_ID'] == $currentParentId) {
            $tuple['children'] = array();
            makeParentChildRelations($inArray, $tuple['children'], $tuple['ID']);
            $outArray[] = $tuple;   
        }
    }
}

$outArray = array();
makeParentChildRelations($inArray, $outArray);

print_r($outArray);

答案 1 :(得分:0)

<?php
$p = array(0 => array());
foreach($nodes as $n)
{
  $pid = $n['pid'];
  $id = $n['id'];

  if (!isset($p[$pid]))
    $p[$pid] = array('child' => array());

  if (isset($p[$id]))
    $child = &$p[$id]['child'];
  else
    $child = array();

  $p[$id] = $n;
  $p[$id]['child'] = &$child;
  unset($p[$id]['pid']);
  unset($p[$id]['level']);
  unset($child);

  $p[$pid]['child'][] = &$p[$id];    
  // $p[$pid]['child'] = &$p[$id]; // or this, if only one child
}
$nodes = $p['0']['child'];
unset($p);
?>

如果每个节点只能有一个孩子,那么用$p[$pid]['child'] = &$p[$id];替换一行。

(编辑:无论节点如何排序,都将其修复为工作。)