如何将multidimensional array“扁平化”为简单的PHP?

这可能是初学者的问题,但我已经通过文档更长的时间了,我找不到任何解决scheme。 我以为我可以使用implode为每个维度,然后把这些string与str_split重新组成一个新的简单的数组。 然而,我永远不知道如果连接模式也不是值也是如此之后做str_split我的原始值可能会中断。

是否有像multidimensional array内的数组combine($array1, $array2)

使用array_values 。 (例如从PHP网站)

 <?php $aNonFlat = array( 1, 2, array( 3, 4, 5, array( 6, 7 ), 8, 9, ), 10, 11 ); $objTmp = (object) array('aFlat' => array()); array_walk_recursive($aNonFlat, create_function('&$v, $k, &$t', '$t->aFlat[] = $v;'), $objTmp); var_dump($objTmp->aFlat); /* array(11) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) [6]=> int(7) [7]=> int(8) [8]=> int(9) [9]=> int(10) [10]=> int(11) } */ ?> 
 $array = your array $result = call_user_func_array('array_merge', $array); echo "<pre>"; print_r($result); 

REF: http : //php.net/manual/en/function.call-user-func-array.php

这是另一个解决scheme(适用于multidimensional array):

 function array_flatten($array) { $return = array(); foreach ($array as $key => $value) { if (is_array($value)){ $return = array_merge($return, array_flatten($value));} else {$return[$key] = $value;} } return $return; } $array = Your array $result = array_flatten($array); echo "<pre>"; print_r($result); 

这是一条线,SUPER易于使用:

 $result = array(); array_walk_recursive($original_array,function($v, $k) use (&$result){ $result[] = $v; }); 

非常容易理解,在匿名函数/ closure中,$ v是值,$ k是原始数组的关键字。

 // $array = your multidimensional array $flat_array = array(); foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $k=>$v){ $flat_array[$k] = $v; } 

还logging: http : //www.phpro.org/examples/Flatten-Array.html

PHP的用户评论 (简化)和这里的另一种方法:

 function array_flatten_recursive($array) { if (!$array) return false; $flat = array(); $RII = new RecursiveIteratorIterator(new RecursiveArrayIterator($array)); foreach ($RII as $value) $flat[] = $value; return $flat; } 

这种方法最大的好处就是它跟踪recursion的深度,如果你需要这样做的话就会变平。
这将输出:

 $array = array( 'A' => array('B' => array( 1, 2, 3)), 'C' => array(4, 5) ); print_r(array_flatten_recursive($array)); #Returns: Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) 
 function flatten_array($array, $preserve_keys = 0, &$out = array()) { # Flatten a multidimensional array to one dimension, optionally preserving keys. # # $array - the array to flatten # $preserve_keys - 0 (default) to not preserve keys, 1 to preserve string keys only, 2 to preserve all keys # $out - internal use argument for recursion foreach($array as $key => $child) if(is_array($child)) $out = flatten_array($child, $preserve_keys, $out); elseif($preserve_keys + is_string($key) > 1) $out[$key] = $child; else $out[] = $child; return $out; } 

在PHP> = 5.3中,基于Luc M的答案(第一个),可以使用这样的闭包

 array_walk_recursive($aNonFlat, function(&$v, $k, &$t){$t->aFlat[] = $v;}, $objTmp); 

我喜欢这个,因为我不需要用引号括起函数的代码,就像使用create_function()

一个非recursion解决scheme(但是命令销毁):

 function flatten($ar) { $toflat = array($ar); $res = array(); while (($r = array_shift($toflat)) !== NULL) { foreach ($r as $v) { if (is_array($v)) { $toflat[] = $v; } else { $res[] = $v; } } } return $res; } 

在PHP 7中,您可以使用生成器和生成器代理( yield from )来压扁数组:

 function array_flatten_iterator (array $array) { foreach ($array as $value) { if (is_array($value)) { yield from array_flatten_iterator($value); } else { yield $value; } } } function array_flatten (array $array) { return iterator_to_array(array_flatten_iterator($array), false); } 

例:

 $array = [ 1, 2, [ 3, 4, 5, [ 6, 7 ], 8, 9, ], 10, 11, ]; var_dump(array_flatten($array)); 

http://3v4l.org/RU30W

使用高阶函数(注意:我使用的是内联匿名函数 ,它出现在PHP 5.3中):

 function array_flatten($array) { return array_reduce( $array, function($prev, $element) { if (!is_array($element)) $prev[] = $element; else $prev = array_merge($prev, array_flatten($element)); return $prev; }, array() ); } 

一个基于上一个示例函数的混沌混沌的新方法,它修复了覆盖多列表中string键的缺陷:

 # Flatten a multidimensional array to one dimension, optionally preserving keys. # $array - the array to flatten # $preserve_keys - 0 (default) to not preserve keys, 1 to preserve string keys only, 2 to preserve all keys # $out - internal use argument for recursion function flatten_array($array, $preserve_keys = 2, &$out = array(), &$last_subarray_found) { foreach($array as $key => $child) { if(is_array($child)) { $last_subarray_found = $key; $out = flatten_array($child, $preserve_keys, $out, $last_subarray_found); } elseif($preserve_keys + is_string($key) > 1) { if ($last_subarray_found) { $sfinal_key_value = $last_subarray_found . "_" . $key; } else { $sfinal_key_value = $key; } $out[$sfinal_key_value] = $child; } else { $out[] = $child; } } return $out; } Example: $newarraytest = array(); $last_subarray_found = ""; $this->flatten_array($array, 2, $newarraytest, $last_subarray_found); 
 /*consider $mArray as multidimensional array and $sArray as single dimensional array this code will ignore the parent array */ function flatten_array2($mArray) { $sArray = array(); foreach ($mArray as $row) { if ( !(is_array($row)) ) { if($sArray[] = $row){ } } else { $sArray = array_merge($sArray,flatten_array2($row)); } } return $sArray; } 

你可以试试这个:

 function flat_an_array($a) { foreach($a as $i) { if(is_array($i)) { if($na) $na = array_merge($na,flat_an_array($i)); else $na = flat_an_array($i); } else $na[] = $i; } return $na; } 

如果丢失了数组键,那么可以使用recursion闭包(recursive closure)来平滑multidimensional array作为使用array_values()的callback函数,确保此callback函数是array_walk()的参数,如下所示。

 <?php $array = [1,2,3,[5,6,7]]; $nu_array = null; $callback = function ( $item ) use(&$callback, &$nu_array) { if (!is_array($item)) { $nu_array[] = $item; } else if ( is_array( $item ) ) { foreach( array_values($item) as $v) { if ( !(is_array($v))) { $nu_array[] = $v; } else { $callback( $v ); continue; } } } }; array_walk($array, $callback); print_r($nu_array); 

前面的例子的一个缺点是它涉及比使用array_walk_recursive()和简化的callback的以下解决scheme编写更多的代码:

 <?php $array = [1,2,3,[5,6,7]]; $nu_array = []; array_walk_recursive($array, function ( $item ) use(&$nu_array ) { $nu_array[] = $item; } ); print_r($nu_array); 

查看实时代码

这个例子似乎比上一个更好,隐藏了关于如何从multidimensional array中提取值的细节。 当然,迭代是发生的,但是否需要recursion或者控制结构,你只需要仔细阅读array.c 。 由于函数式编程关注的是input和输出,而不是获得结果的细节,所以人们可以不关心幕后的迭代是如何发生的,直到一个观点雇主提出这样一个问题。

如果您只对某个特定键的值感兴趣,则可能会发现这种方法很有用:

 function valuelist($array, $array_column) { $return = array(); foreach($array AS $row){ $return[]=$row[$array_column]; }; return $return; }; 

例:

给定$ get_role_action =

 array(3) { [0]=> array(2) { ["ACTION_CD"]=> string(12) "ADD_DOCUMENT" ["ACTION_REASON"]=> NULL } [1]=> array(2) { ["ACTION_CD"]=> string(13) "LINK_DOCUMENT" ["ACTION_REASON"]=> NULL } [2]=> array(2) { ["ACTION_CD"]=> string(15) "UNLINK_DOCUMENT" ["ACTION_REASON"]=> NULL } } 

$variables['role_action_list']=valuelist($get_role_action, 'ACTION_CD'); 会导致:

 $variables["role_action_list"]=> array(3) { [0]=> string(12) "ADD_DOCUMENT" [1]=> string(13) "LINK_DOCUMENT" [2]=> string(15) "UNLINK_DOCUMENT" } 

从那里你可以执行价值查询如下:

 if( in_array('ADD_DOCUMENT', $variables['role_action_list']) ){ //do something }; 

这一切都没有为我工作…所以不得不自己运行它。 工作得很好:

 function arrayFlat($arr){ $out = ''; foreach($arr as $key => $value){ if(!is_array($value)){ $out .= $value.','; }else{ $out .= $key.','; $out .= arrayFlat($value); } } return trim($out,','); } $result = explode(',',arrayFlat($yourArray)); echo '<pre>'; print_r($result); echo '</pre>'; 

给定multidimensional array并将其转换为一维,可以通过取消设置具有数组的所有值并将其保存到第一维来完成,例如:

 function _flatten_array($arr) { while ($arr) { list($key, $value) = each($arr); is_array($value) ? $arr = $value : $out[$key] = $value; unset($arr[$key]); } return (array)$out; } 

您可以使用非标准PHP库(NSPL)中的扁平函数。 它适用于数组和任何可迭代的数据结构。

 assert([1, 2, 3, 4, 5, 6, 7, 8, 9] === flatten([[1, [2, [3]]], [[[4, 5, 6]]], 7, 8, [9]])); 

简单的方法..通过recursion查看..

 <?php function flatten_array($simple){ static $outputs=array(); foreach ( $simple as $value) { if(is_array($value)){ flatten_array($value); } else{ $outputs[]=$value; } } return $outputs; } $eg=['s'=>['p','n'=>['t']]]; $out=flatten_array($eg); print_r($out); ?>