将单维数组转换为多维关联数组

时间:2012-01-21 20:03:15

标签: php arrays multidimensional-array

这个让我难过。我搜索并发现了类似的问题,但我似乎无法找到任何符合我确切问题的问题。

在PHP中,我有一个像这样的数组:

<?php
   $array = array('one', 'two', 'three', 'four');
?>

我想将其转换为多维数组,如下所示:

<?php
   $new_array = array('one' => array('two' => array('three' => array('four' => NULL))));
   // or, to put another way:
   $new_array['one']['two']['three']['four'] = NULL;
?>

请记住,我不知道原始数组中有多少项,我需要一种方法来递归创建一个多维关联数组。

这似乎是一件容易的事,但我似乎无法弄清楚这一点。

2 个答案:

答案 0 :(得分:5)

您可以使用引用轻松完成此操作:

$out = array();
$cur = &$out;
foreach ($array as $value) {
    $cur[$value] = array();
    $cur = &$cur[$value];
}
$cur = null;

打印$out应该会给您:

Array
(
    [one] => Array
        (
            [two] => Array
                (
                    [three] => Array
                        (
                            [four] => 
                        )
                )
        )
)

答案 1 :(得分:1)

function recursive_array_convert ($input, &$result = array()) {
  $thisLevel = array_shift($input);
  if (count($input)) {
    if (!isset($result[$thisLevel]) || !is_array($result[$thisLevel])) {
      $result[$thisLevel] = array();
    }
    recursive_array_convert($input, $result[$thisLevel]);
  } else {
    $result[$thisLevel] = NULL;
  }
  return $result;
}

这个函数应该给你很大的灵活性 - 你可以简单地将输入数组传递给第一个参数并在返回中捕获结果,或者你可以将现有变量传递给第二个参数以使其填充结果。这意味着您可以通过以下方式实现您想要的示例:

$result = recursive_array_convert(array('one', 'two', 'three', 'four'));

...或...

recursive_array_convert(array('one', 'two', 'three', 'four'), $result);

乍一看,此选项似乎没什么意义,但请考虑以下因素:

$result = array();
recursive_array_convert(array('one', 'two', 'three', 'four'), $result);
recursive_array_convert(array('five', 'six', 'seven', 'eight'), $result);
print_r($result);
/* Output:

  Array
  (
    [one] => Array
      (
        [two] => Array
          (
            [three] => Array
              (
                [four] => 
              )
          )
      )
    [five] => Array
      (
        [six] => Array
          (
            [seven] => Array
              (
                [eight] => 
              )
          )
      )
  )

*/

如您所见,该函数可用于在同一变量中创建任意数量的链。