将multidimensional array转换为一维数组
现在我一直在这个问题上磕头。
我有这个multidimensional array:
Array ( [0] => Array ( [0] => foo [1] => bar [2] => hello ) [1] => Array ( [0] => world [1] => love ) [2] => Array ( [0] => stack [1] => overflow [2] => yep [3] => man )
我需要得到这个:
Array ( [0] => foo [1] => bar [2] => hello [3] => world [4] => love [5] => stack [6] => overflow [7] => yep [8] => man )
有任何想法吗?
我发现的所有其他解决scheme解决multidimensional array与不同的密钥。 我的数组只使用简单的数字键。
array_reduce($array, 'array_merge', array())
例:
$a = array(array(1, 2, 3), array(4, 5, 6)); $result = array_reduce($a, 'array_merge', array());
结果:
array[1, 2, 3, 4, 5, 6];
PHP array_merge
Docs函数可以将您的数组展平:
$flat = call_user_func_array('array_merge', $array);
如果原始数组的深度高于2级,则PHP中的SPL具有一个RecursiveArrayIterator
您可以使用它来将其展平:
$flat = iterator_to_array(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)), 0);
另请参阅: 如何平铺multidimensional array? 。
这其实是一切:
foreach($array as $subArray){ foreach($subArray as $val){ $newArray[] = $val; } }
你可以使用array_column()
例:
<?php // Array representing a possible record set returned from a database $records = array( array( 'id' => 2135, 'first_name' => 'John', 'last_name' => 'Doe', ), array( 'id' => 3245, 'first_name' => 'Sally', 'last_name' => 'Smith', ), array( 'id' => 5342, 'first_name' => 'Jane', 'last_name' => 'Jones', ), array( 'id' => 5623, 'first_name' => 'Peter', 'last_name' => 'Doe', ) ); $first_names = array_column($records, 'first_name'); print_r($first_names); ?>
解决scheme:我使用了hakre的解决scheme,尽pipe我也尝试过deceze的解决scheme,并且它也可以工作。 我写了:
$flat = call_user_func_array('array_merge', $array);
简单。
foreach ($a as $v1) { foreach ($v1 as $v2) { echo "$v2\n"; } }
$ a是你的数组名称。 了解详情
从PHP 5.3开始,最短的解决scheme似乎是array_walk_recursive()和新的闭包语法:
function flatten(array $array) { $return = array(); array_walk_recursive($array, function($a) use (&$return) { $return[] = $a; }); return $return; }
在PHP5.6中还有其他的方法来解决这个问题,结合函数, array_shift()
移除原始数组的第一个元素, array_pus()
添加一个新的数组,重要的是...
splapt / elipse运算符,它将像参数一样解压array_shitf()
的返回值。
<?php $arr = [ ['foo', 'bar', 'hello'], ['world', 'love'], ['stack', 'overflow', 'yep', 'man', 'wow'] ]; $new = []; while($item = array_shift($arr)){ array_push($new, ...$item); } print_r($new);
输出:
Array ( [0] => foo [1] => bar [2] => hello [3] => world [4] => love [5] => stack [6] => overflow [7] => yep [8] => man [9] => wow )
例子 – ideone
我曾经使用这个代码来解决相同types的问题。 所以你也可以试试这个。
function array_flatten($array) { if (!is_array($array)) { return FALSE; } $result = array(); foreach ($array as $key => $value) { if (is_array($value)) { $result = array_merge($result, array_flatten($value)); } else { $result[$key] = $value; } } return $result; }
$blocked_dates = array( '2014' => Array ( '8' => Array ( '3' => '1', '4' => '1', '6' => '1', '10' => '1', '15' => '1', '25' => '1' ) ), '2015' => Array ( '9' => Array ( '3' => '1', '4' => '1', '6' => '1', '10' => '1', '15' => '1', '25' => '1' ) ) );
RESUTL(一维arrays):
$unavailable_dates = array(); foreach ($blocked_dates as $year=>$months) { foreach ($months as $month => $days) { foreach ($days as $day => $value) { array_push($unavailable_dates,"$year-$month-$day"); } } } $unavailable_dates = json_encode($unavailable_dates); print_r($unavailable_dates); OUTPUT : ["2014-8-3","2014-8-4","2014-8-6","2014-8-10","2014-8-15","2014-8-25","2015-9-3","2015-9-4","2015-9-6","2015-9-10","2015-9-15","2015-9-25"]