2017-06-09 23 views
0

私は、着信POST配列を持っている:PHPでツリーを構築するには?

$parameters = array("1" , "2" , "3", "4", "5"); 
$parents = array("null" , "1" , "1", "3", "3"); 
$values = array("A" , "B" , "C", "D", "E"); 

$parametersの数は無制限です。

したがって、ネストされたパラメータを持つツリーを構築する必要があります。

結果の出力は次のようになります。

1 -> {2 => value, 3 -> {4 => value, 5 => value}} 

私は以下のループを使用してみました:

foreach ($parameters["parameters"] as $index => $id) { 
    if(!is_null($parameters["parents"][$index])){ 
     $output[$parameters["parents"][$index]][] = $id; 
    } 
} 

をしかし、それは唯一のツリーレベルのために働く、私は再帰的なアプローチを使用する必要があると思います。

+1

あなたのロジックがここに何\ –

答えて

0

array() $refsのルート要素の参照を保持することで反復的なアプローチを使用できます。
ここのコードでは、子供がいる要素の値が失われています - あなたの必要条件ですが、結果としてarrayの明示的なキーを使用して保持することができます - たとえばvalue => ..., children => array()です。

$parameters = array('1', '2', '3', '4', '5'); 
$parents = array('null', '1', '1', '3', '3'); 
$values = array( 'A', 'B', 'C', 'D', 'E'); 

$tree = array(); 
$refs = array(); 
foreach ($parameters as $key=>$val) { 
    if (isset($refs[$parents[$key]])) { 
     if(!is_array($refs[$parents[$key]])) 
      $refs[$parents[$key]] = array(); 
     $refs[$parents[$key]][$val] = $values[$key]; 
     $refs[$val] = &$refs[$parents[$key]][$val]; 
    } else { 
     $tree[$val] = $values[$key]; 
     $refs[$val] = &$tree[$val]; 
    } 
} 

print_r($tree); 

上記の意志の印刷:?

Array 
(
    [1] => Array 
     (
      [2] => B 
      [3] => Array 
       (
        [4] => D 
        [5] => E 
       ) 
     ) 
) 
関連する問題