2011-10-06 49 views
1

我有一个数组:我想嵌套数组。第三个层次是消失

$a = array(
    "7" => array(
     "id" => 7, 
     "parent" => 6 
    ), 
    "6" => array(
     "id" => 6, 
     "parent" => 5 
    ), 
    "5" => array(
     "id" => 5, 
     "parent" => 4 
    ), 
    "4" => array(
     "id" => 4, 
     "parent" => 0 
    ), 
    "3" => array(
     "id" => 7, 
     "parent" => 2 
    ), 
    "2" => array(
     "id" => 7, 
     "parent" => 1 
    ), 
    "1" => array(
     "id" => 7, 
     "parent" => 0 
    ) 
); 

结果是:

$a = array(
    "4" => array(
     "id" => 4, 
     "parent" => 0, 
     array(
      "5" => array(
       "id" => 5, 
       "parent" => 4, 
       array(
        "6" => array(
         "id" => 6, 
         "parent" => 5, 
         array(
          "7" => array(
           "id" => 7, 
           "parent" => 6 
          ) 
         ) 
        ) 
       ) 
      ) 
     ) 
    ), 
    "2" => array(
     "id" => 7, 
     "parent" => 1, 
     array(
      "3" => array(
       "id" => 7, 
       "parent" => 2 
      ) 
     ) 
    ), 
    "1" => array(
     "id" => 7, 
     "parent" => 0 
    ) 
); 

,我使用的代码是这样的:

foreach($a as $v) 
{ 
    if(isset($a[$v['PARENT']])) 
    { 
     $a[$v['PARENT']][$v['ID']] = $v; 
     unset($a[$v['ID']]); 
    } 
} 

和问题是我得到的结果是:

$a = array(
    "4" => array(
     "id" => 4, 
     "parent" => 0, 
     array(
      "5" => array(
       "id" => 5, 
       "parent" => 4 
      ) 
     ) 
    ), 
    "2" => array(
     "id" => 7, 
     "parent" => 1, 
     array(
      "3" => array(
       "id" => 7, 
       "parent" => 2 
      ) 
     ) 
    ), 
    "1" => array(
     "id" => 7, 
     "parent" => 0 
    ) 
); 

而不是它的结果。

+0

任何人都可以帮助我吗? :? –

+0

有人帮我吗? –

+0

我已经在您的上一个问题中为您的问题提供了[解决方案](http://stackoverflow.com/questions/7671905/nested-array-to-html-list/7672073#7672073)。它不工作? – binaryLV

回答

4

解决你的问题,你需要正确地理解如何variable referencing/aliasing in PHP作品。

请看下面的示例代码,它不看你太大的不同,但利用引用才能访问,即使它已经“移师”任何父母:

# transform $flat into a tree: 
foreach($flat as $id => &$value) 
{ 
    # check if there is a parent 
    if ($parentId = $value['parent']) 
    { 
     $flat[$parentId][0][$id] =& $value; # add child to parent 
     unset($flat[$id]); # remove reference from topmost level 
    } 
} 
unset($value); # remove iterator reference 
print_r($flat); # your tree 

$flat现在包含所有值从$flat - 但重新排序。 Demo

+0

整洁。 +1给你... – DaveRandom

+0

非常感谢!你的帮助对我来说非常重要! –

1

你确定输出数组是正确的吗?关键2肯定是1的孩子(因为2'parent'=>1)?如果情况并非如此,我不明白究竟在做什么以及密钥如何相互关联。

如果2应该是1一个孩子,这个工程:

$keep = array(); 
foreach ($a as $k => &$v) { 
    // Loop the array first time and create references to 
    // structure the array how you want it 
    if ($v['parent']) { 
    $a[$v['parent']][0] = array($k => &$v); 
    } else $keep[] = $k; 
} 

foreach ($a as $k => $v) { 
    // Loop it again to get rid of non-root nodes from the root 
    if (!in_array($k,$keep)) { 
    unset($a[$k]); 
    } 
} 

print_r($a); 
+0

您可以将第二个foreach中的代码放入第一个(在用'$ keep'改变代码之前) – hakre

+0

@Hakre我的确在想这件事,但我认为你不可以 - 如果你随意移除它们,并且后面的元素具有一个你没有设置,它不会工作,我认为,我玩了一段时间,并没有提出一个实际上按预期工作的单个循环,但会很高兴被证明是错误的,但... – DaveRandom

+0

检查[我的答案](http://stackoverflow.com/questions/7673044/nested-array-third-level-is-消失/ 7673415#7673415),它有一个单一的循环。并玩一个演示。你甚至可以移动上一行将unild($ flat [$ id])* *移到父代的那一行。 – hakre