如何将多维数组展平?

25 浏览
0 Comments

如何将多维数组展平?

在PHP中,是否可能在不使用递归或引用的情况下展开(双/多)维数组?\n我只关心值,可以忽略键,我考虑使用array_map()array_values()

0
0 Comments

PHP 5.6及以上版本可以使用array_merge函数在使用...运算符展开外部数组后,来压平二维数组。这段代码简单明了。

在PHP 8.0及之前的版本中,如果外部数组具有非数字键,则无法使用数组展开。从PHP 8.1开始,支持使用字符串键展开数组。为了支持8.0及之前的版本,应该先调用array_values函数。

如果外部数组为空,这样的操作会报错,因为array_merge函数会没有参数进行调用。可以通过在第一个参数中添加一个空数组来避免这个问题。

这个方法仅在数组的每个元素都是数组的情况下有效。如果数组包含混合类型,例如标量值,将会报错。

如果使用关联数组,可以查看这个解决方案。

这个语法看起来很酷,虽然我已经用PHP编程了5年,但从来没有听说过这个(...)操作符。不过它确实很好用!

非常棒的答案。

0
0 Comments

如何将多维数组展平?

在处理多维数组时,有时候我们需要将其展平为一维数组。下面是一些解决这个问题的方法。

方法一:使用SPL库中的RecursiveIteratorIterator类

$a = array(1,2,array(3,4, array(5,6,7), 8), 9);
$it = new RecursiveIteratorIterator(new RecursiveArrayIterator($a));
foreach($it as $v) {
  echo $v, " ";
}

以上代码将输出:1 2 3 4 5 6 7 8 9。

方法二:使用iterator_to_array函数

$it = new RecursiveIteratorIterator(new RecursiveArrayIterator($a));
$flattenedArray = iterator_to_array($it, false);

以上代码将将多维数组展平为一维数组并存储在$flattenedArray变量中。

然而,需要注意的是,如果不设置iterator_to_array函数的第二个参数或将其设置为true,那么重复的键将会被覆盖。所以,在使用iterator_to_array函数时,需要小心处理重复键的情况。

另外,某些情况下方法一和方法二会丢弃对象类型的值。为了解决这个问题,可以扩展RecursiveArrayIterator类,具体代码可以参考链接:https://gist.github.com/tcz/5618763

最后,还有一种方法是将参数强制转换为数组类型,具体代码如下:

function flatten($arr){ 
    $it = new RecursiveIteratorIterator(new RecursiveArrayIterator((array) $arr)); 
    return iterator_to_array($it, true); 
}

以上是一些将多维数组展平为一维数组的方法,希望对大家有所帮助。

0
0 Comments

如何将多维数组展平?

在PHP 5.3及更高版本中,最短的解决方法似乎是使用array_walk_recursive()和新的闭包语法:

function flatten(array $array) {
    $return = array();
    array_walk_recursive($array, function($a) use (&$return) { $return[] = $a; });
    return $return;
}

如果你想保留数组的键,可以使用以下代码:

function flatten(array $array) {
    $return = array();
    array_walk_recursive($array, function($a, $b) use (&$return) { $return[$b] = $a; });
    return $return;
}

如果你使用PHP 5.2,可以尝试重写代码,但是必须使用"use"语法来使其与array_walk_recursive函数一起使用,因为该函数不接受可选的$userdata参数的引用。

有人提出了一个问题,他发现这个方法对于某些数组有效,但对于另一些数组则无效。原因是数组的值被当作键来处理,所以当在数组中引入自定义的键值对时,数组中的值会被当作没有值的键,并且由于键必须是唯一的,当两个键匹配时,值会被添加到相同的键中。一个简单的解决方法是先对数组进行排序。这是PHP中固有的行为。

有人问为什么代码中明确地通过引用传递返回的数组。事实上,PHP中的数组默认是按值传递的。但为了提高性能,PHP在内部使用引用,直到数组中的某些内容发生改变为止。然后它会创建一个副本,并且只对副本进行更改。

还有人问是否可以保留简单空数组(多维非关联数组)的键。根据建议,可以将匿名函数设置为静态的,这样可以提高内存和效率。

总结如下,通过使用array_walk_recursive()函数和闭包语法,可以将多维数组展平。这是一种高效的方法,性能比其他算法要好。然而,需要注意的是,当数组中的值被当作键时,可能会出现一些问题。为了解决这个问题,可以在使用之前对数组进行排序。另外,需要注意PHP中数组的传递方式以及通过将匿名函数设置为静态的来提高性能。

0