代码之家  ›  专栏  ›  技术社区  ›  Andrew Rumm

用PHP将二维数组转换为三维数组

  •  0
  • Andrew Rumm  · 技术社区  · 15 年前

    有一些简单的二维数组,有类似这样的树:

    • NODE1
      • NoDE2
        • NODE3

    其结构为:

    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 回复  |  直到 15 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    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);
    
        2
  •  0
  •   Matthew    15 年前
    <?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];