2011-03-01 97 views
1

我有一些數據格式爲:如何遞歸創建嵌套的PHP數組?

one,one 
two,two 
sub_one,one 
sub_two,two 
sub_sub_one,sub_one 
sub_sub_two,sub_two 
sub_sub_sub_one,sub_sub_one 
sub_sub_sub_two,sub_sub_two 

現在我想創建嵌套數組包含數據,我編寫了這一點:

<?php 
$lines[] = "one,one"; 
$lines[] = "two,two"; 
$lines[] = "sub_one,one"; 
$lines[] = "sub_two,two"; 
$lines[] = "sub_sub_one,sub_one"; 
$lines[] = "sub_sub_two,sub_two"; 
$lines[] = "sub_sub_sub_one,sub_sub_one"; 
$lines[] = "sub_sub_sub_two,sub_sub_two"; 

foreach($lines as $line) 
{ 
    $tmp = explode(",", $line); 
    $array[$tmp[1]][$tmp[0]] = $tmp[0]; 
} 

foreach($array as $key => $value) 
{ 
    foreach($array[$key] as $value2) 
    { 
     if(array_key_exists($value2, $array) && $value2 != $key) 
     {   
      $array[$key][$value2] = $array[$value2]; 
      $unset[] = $value2; 
     } 
     else 
     { 
      unset($array[$key]); 
     } 
    } 
} 

foreach($unset as $un) 
{ 
    unset($array[$un]); 
} 

print_r($array); 
?> 

但這只是下降到第3級和沒有進一步。輸出看起來是這樣的:

Array 
(
    [one] => Array 
     (
      [sub_one] => Array 
       (
        [sub_sub_one] => sub_sub_one 
       ) 

     ) 

    [two] => Array 
     (
      [sub_two] => Array 
       (
        [sub_sub_two] => sub_sub_two 
       ) 

     ) 

) 

sub_sub_sub_onesub_sub_sub_two不在輸出,我怎樣才能讓我的代碼遞歸所以不管有多少水平或關係中它仍然有效數據存在?

+0

將列表中始終以正確的順序(父總會任何童裝之前上市?) – 2011-03-01 16:28:32

回答

1

Hmm from your code我明白,「one,one」意思是「one」在頂層,否則「a,b」的意思是「a」是「b」的子代。

您可以將所有鏈接轉換爲關聯數組格式,如果sub_a是'a'的子節點,則$ links ['a'] ='sub_a'。 然後用它的更深和更深的鍵的子元素遞歸地嵌套$嵌套。

示例代碼如下:

<?php 

$nested = array(); 
$links = array(); 

// first, create a structure that contains the connections between elements 
foreach ($lines as $line) { 
    list($child, $parent) = explode(",", $line); 
    if ($child == $parent) { 
    $nested[$parent] = null; 
    } else { 
    // add it to the children of parent 
    $links[$parent][] = $child; 
    } 
} 

function process(&$arr) { 
    global $links; 
    foreach ($arr as $key => $value) { 
    // no more children => stop recursion 
    if (!array_key_exists($key, $links)) { 
     $array[$key] = null; 
     continue; 
    } 
    // insert its children 
    $arr[$key] = array_flip($links[$key]); 
    // recurse down 
    process($arr[$key]); 
    } 
} 

process($nested); 

// $nested contains your m-dim array 
print_r($nested); 

?> 

和輸出:

Array 
(
    [one] => Array 
     (
      [sub_one] => Array 
       (
        [sub_sub_one] => Array 
         (
          [sub_sub_sub_one] => 
         ) 

       ) 

     ) 

    [two] => Array 
     (
      [sub_two] => Array 
       (
        [sub_sub_two] => Array 
         (
          [sub_sub_sub_two] => 
         ) 

       ) 

     ) 

)