【问题标题】:Flatten array while preserving key value pairs in PHP在 PHP 中保留键值对的同时展平数组
【发布时间】:2017-06-11 10:20:38
【问题描述】:

我有一个这样的数组:

array (size=4)
  0 =>
    array (size=4)
      key => value
      key => value
      key => value
      key => value
  1 =>
    array (size=2)
      key => value
      key => value
  2 =>
    array (size=1)
      key => value
  3 =>
    array (size=1)
      key => value

我想把数组展平成这样:

array (size=4)
  key => value
  key => value
  key => value
  key => value
  key => value
  key => value
  key => value
  key => value

我已经尝试过使用array_mergearray_walk_recursiveRecursiveIteratorIteratorRecursiveArrayIterator 之类的解决方案。我还尝试了许多在 StackOverflow 上发布的类似问题的解决方案,但它们都没有按我预期的方式工作。他们要么不保留键值对,要么给我一个与原始数组相同的数组。我的尝试看起来像这样:

$multidimensionalArray = array(stuff goes here);
$flatArray = array();

function flattenArray ($array) {
  foreach ($array as $key => $value) {
    if (is_array($value) {
      flattenArray($value);
    }
    else {
      $flatArray[$key] = $value;
    }
  }
}

flattenArray($multidimensionalArray);

【问题讨论】:

  • 您可能无法访问函数内部的全局变量$flatArray。将其声明为全局内部或通过引用函数将其传递
  • 你说得对,我没有访问函数中的变量。当我检查循环中 $flatArray 的内容时,我发现它正确地展平了每个子数组,但它们没有连接在一起。我已经尝试使用 array_merge 来纠正这个问题,但是在循环完成后,我只得到了最终的键值对。

标签: php arrays recursion multidimensional-array flatten


【解决方案1】:

我想知道RecursiveArrayIterator 会出现什么问题,因为您只需要使用最简单的foreach 循环从迭代器中收集键/值对:

$a = [
  0 => ['a' => 1, 'b' => 2],
  1 => ['x' => 3, 'y' => 4],
  2 => 5,
  3 => ['m' => 6, ['k' => 7, 'n' => 8]],
];

$it = new RecursiveIteratorIterator(new RecursiveArrayIterator($a));

foreach ($it as $key => $value) {
  $result[$key] = $value;
}

print_r($result);

输出:

Array
(
    [a] => 1
    [b] => 2
    [x] => 3
    [y] => 4
    [2] => 5
    [m] => 6
    [k] => 7
    [n] => 8
)

【讨论】:

  • 打印结果时看起来确实正确,但是当我签入 var_dump 时,键实际上被替换为 0 到 7,而值被保留了。
  • @user6679670, var_dump 没有区别,除非它是一个错误的var_dump,或者var_dump 正在打印一个错误地实现__debuginfo 方法的对象。 var_dump 的示例:eval.in/725158(如您所见,密钥被保留)
  • 我不认为这是 var_dump 的问题,因为当我稍后在我的代码中尝试引用键时,它们不存在(只是索引 0、1、2 等) ) 我将键和值分别展平,然后使用 combine_array 将它们与正确的键/值对连接在一起。
  • 真傻,我在 foreach 循环期间没有正确使用键/值对。它现在工作正常。谢谢!
  • 这很酷,谢谢,这是实现这一目标的唯一方法吗?还有其他更简单的方法吗?
猜你喜欢
  • 1970-01-01
  • 2016-02-02
  • 2021-05-29
  • 2023-01-13
  • 1970-01-01
  • 2011-12-12
  • 2018-05-25
  • 2021-09-14
  • 2019-07-30
相关资源
最近更新 更多