【问题标题】:How to create nested php arrays recursively?如何递归地创建嵌套的php数组?
【发布时间】:2011-03-02 01:05:07
【问题描述】:

我有一些这种格式的数据:

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 不在输出中,如何使我的代码递归,以便无论数据中存在多少级别或关系,它仍然可以工作?

【问题讨论】:

  • 列表是否总是按正确的顺序排列(父母总是排在任何孩子之前?)

标签: php arrays multidimensional-array


【解决方案1】:

嗯,从您的代码中,我了解到“one,one”表示“one”处于顶层,否则“a,b”表示“a”是“b”的子级。

您可以将所有链接转换为关联数组格式,如果 sub_a 是 'a' 的子级,则 $links['a'] = 'sub_a'。 然后用其越来越深的键的子代递归地填充 $nested。

示例代码如下:

<?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] => 
                        )

                )

        )

)

【讨论】:

    猜你喜欢
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2018-05-24
    • 2020-06-26
    • 2017-02-02
    • 2021-03-04
    相关资源
    最近更新 更多