如何将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));
使用高阶函数(注意:我使用的是内联匿名函数 ,它出现在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); ?>