PHP索引数组到嵌套关联数组

时间:2018-06-06 20:48:25

标签: php arrays multidimensional-array converter

我需要根据特定规则将简单数组转换为嵌套数组。我已经实现了它,但我正在寻找更好的解决方案。

SIMPLE:

array(4) {
  [0]=>
  array(2) {
    ["id"]=>
    string(2) "11"
    ["type"]=>
    int(3)
  }
  [1]=>
  array(2) {
    ["id"]=>
    string(2) "10"
    ["type"]=>
    int(2)
  }
  [2]=>
  array(2) {
    ["id"]=>
    string(1) "1"
    ["type"]=>
    int(1)
  }
  [3]=>
  array(2) {
    ["id"]=>
    string(1) "0"
    ["type"]=>
    int(1)
  }
}

预期效果:

array(1) {
  [0]=>
  array(2) {
    ["type"]=>
    int(1)
    ["child"]=>
    array(1) {
      [1]=>
      array(2) {
        ["type"]=>
        int(1)
        ["child"]=>
        array(1) {
          [10]=>
          array(2) {
            ["type"]=>
            int(2)
            ["child"]=>
            array(1) {
              [11]=>
              array(2) {
                ["type"]=>
                int(3)
                ["child"]=>
                array(0) {
                }
              }
            }
          }
        }
      }
    }
  }
}

我的解决方案(不太满意):

$nestedArray = [];
    foreach ($simpleArray as $item)
    {
        if (!empty($nestedArray))
        {
            $array = $nestedArray;
            reset($array);
            $firstKey = key($array);
        }
        $nestedArray[$item['id']]['child'] = $nestedArray;
        $nestedArray[$item['id']]['type'] = $item['type'];
        if (!empty($firstKey))
        {
            unset($nestedArray[$firstKey]);
        }
    }

正如我所说,我正在寻找更优雅的方式来实现这一目标。规则很简单:每个下一个项目都是之前的孩子。

1 个答案:

答案 0 :(得分:2)

你可以使用递归:

function nest($arr) {
    return count($arr) ? ["type" => array_pop($arr)["type"], "child" => nest($arr)] : [];
}

使用您的示例输入,它将如下所示:

$simpleArray = [
    ["id" => "11", "type" => 3],
    ["id" => "10", "type" => 2],
    ["id" => "1", "type" => 1],
    ["id" => "0", "type" => 1]
];

function nest($arr) {
    return count($arr) ? ["type" => array_pop($arr)["type"], "child" => nest($arr)] : [];
}

$nested = nest($simpleArray));

$nested将具有以下值:

[
    "type" => 1,
    "child" => [
        "type" => 1,
        "child" => [
            "type" => 2,
            "child" => [
                "type" => 3,
                "child" => []
            ]
        ]
    ]
]