如何将多维数组展平?
PHP 5.6及以上版本可以使用array_merge
函数在使用...
运算符展开外部数组后,来压平二维数组。这段代码简单明了。
在PHP 8.0及之前的版本中,如果外部数组具有非数字键,则无法使用数组展开。从PHP 8.1开始,支持使用字符串键展开数组。为了支持8.0及之前的版本,应该先调用array_values
函数。
如果外部数组为空,这样的操作会报错,因为array_merge
函数会没有参数进行调用。可以通过在第一个参数中添加一个空数组来避免这个问题。
这个方法仅在数组的每个元素都是数组的情况下有效。如果数组包含混合类型,例如标量值,将会报错。
如果使用关联数组,可以查看这个解决方案。
这个语法看起来很酷,虽然我已经用PHP编程了5年,但从来没有听说过这个(...)操作符。不过它确实很好用!
非常棒的答案。
如何将多维数组展平?
在处理多维数组时,有时候我们需要将其展平为一维数组。下面是一些解决这个问题的方法。
方法一:使用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); }
以上是一些将多维数组展平为一维数组的方法,希望对大家有所帮助。
如何将多维数组展平?
在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中数组的传递方式以及通过将匿名函数设置为静态的来提高性能。