2015-06-21 53 views
1

請看下面的例子:轉換表狀陣列的樹狀排列

function tableToTree($array, $parents) 
{ 
    $result = []; 
    $p = $parents; 
    foreach ($array as $k => $row) { 
     $result[$row[$p[0]]][$row[$p[1]]]= $row[$p[2]]; // ** 
    } 
    return $result; 
} 

$foo = [ 
    ['x' => 'a', 'y' => 'n','z'=>'AA'], 
    ['x' => 'a', 'y' => 'm','z'=>'BB'], 
    ['x' => 'b', 'y' => 'v','z'=>'CC'], 
    ['x' => 'b', 'y' => 'w','z'=>'DD'], 
]; 
print_r(tableToTree($foo, ['x', 'y','z'])); 

其中產量:

Array 
(
    [a] => Array 
     (
      [n] => AA 
      [m] => BB 
     ) 

    [b] => Array 
     (
      [v] => CC 
      [w] => DD 
     ) 

) 

上面的代碼只有當只有兩個家長工作。如何改寫**表示的行,以便與任意數量的父母一起工作。

+0

你什麼名字作爲 '父母'?添加'['x'=>'c','y'=>'w','z'=>'DD']'至$ foo – splash58

回答

0
function tableToTree($array, $parent) 
{ 
    $result = array(); 
    foreach ($array as $row) { 
     $r = &$result;         // pointer to result 
     $p = $parent;          // temporary copy of parents 
     while(count($p) > 2) {       // until last key and value 
      $i = array_shift($p);       // next key 
      if(!isset($r[$row[$i]])) $r[$row[$i]] = null; // add level 
      $r = &$r[$row[$i]];       // shift pointer to new level 
     } 
     $r[$row[array_shift($p)]] = $row[array_shift($p)]; // set value 
    } 
    return $result; 
} 

$foo = array(
    array('N' => 2, 'x' => 'a', 'y' => 'n','z'=>'AA'), 
    array('N' => 1, 'x' => 'a', 'y' => 'm','z'=>'BB'), 
    array('N' => 2, 'x' => 'b', 'y' => 'v','z'=>'CC'), 
    array('N' => 1, 'x' => 'b', 'y' => 'w','z'=>'DD'), 
    array('N' => 1, 'x' => 'c', 'y' => 'w','z'=>'DD')); 

print_r(tableToTree($foo, array('N','x', 'y','z'))); 

結果

array (
    2 => array (
    'a' => array ('n' => 'AA',), 
    'b' => array ('v' => 'CC',), 
), 
    1 => array (
    'a' => array ('m' => 'BB',), 
    'b' => array ('w' => 'DD',), 
    'c' => array ('w' => 'DD',), 
), 
)