【问题标题】:Nested array. Third level is disappearing嵌套数组。第三层正在消失
【发布时间】:2011-12-02 03:35:32
【问题描述】:

我有那个数组:

$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
    )
);

而不是需要它的结果。

【问题讨论】:

  • 我已经给你solution你在上一个问题中的问题。没用吗?
  • 我已经更改了来自我的数据库的数据的形式,但现在它无法正常工作。现在问题出在其他位置。当我尝试传递到同一个数组中时,一个二维数组到另一个数组元素中,第二维正在消失。那有什么问题? :(
  • 您犯的错误是您正在删除您仍然需要的值。完成后,您取消设置子项的每个子项 compare with my answer,这也会取消设置,但会更早地引用,以便 实际 值不会被删除而是保留。

标签: php arrays multidimensional-array


【解决方案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);

【讨论】:

  • 您可以将第二个 foreach 中的代码放入第一个(在您使用 $keep 更改代码之前)。
  • @Hakre 我确实考虑过这一点,但我不认为你可以 - 如果你在你去的时候取消设置它们,并且后面的元素有你未设置的元素的父元素,它不会'不工作。我想。我玩了一段时间,无法想出一个实际按预期工作的循环。很高兴被证明是错误的......
  • 检查my answer,它有一个循环。还有一个可以玩的演示。您甚至可以将 unset($flat[$id]) above 移动到将子元素添加到父元素的上一行。
【解决方案2】:

要解决您的问题,您需要正确理解 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.

【讨论】:

  • 非常感谢 hakre !您的帮助对我来说非常重要!
猜你喜欢
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 2021-09-22
  • 2012-08-20
  • 1970-01-01
  • 2021-08-05
相关资源
最近更新 更多