這可能是初學者的問題,但我已經通過文檔更長的時間了,我找不到任何解決方案。我認爲我可以在每個維度上使用implode,然後將這些字符串與str_split
重新組合以創建新的簡單數組。然而,我永遠不知道如果加入模式不是也在價值觀,所以在做了str_split
我的原始價值可能會打破。如何將多維數組「扁平化」爲簡單的PHP?
對於多維數組內的數組是否有像combine($array1, $array2)
?
這可能是初學者的問題,但我已經通過文檔更長的時間了,我找不到任何解決方案。我認爲我可以在每個維度上使用implode,然後將這些字符串與str_split
重新組合以創建新的簡單數組。然而,我永遠不知道如果加入模式不是也在價值觀,所以在做了str_split
我的原始價值可能會打破。如何將多維數組「扁平化」爲簡單的PHP?
對於多維數組內的數組是否有像combine($array1, $array2)
?
Use array_values
. (Example from php site)
<?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)
}
*/
?>
謝謝!我下次可能也應該檢查用戶註釋。 – Adriana 2009-02-08 23:11:25
有沒有人知道爲什麼這不起作用,除非我使用(折舊)的通話時間通過引用。 array_walk_recursive($ array,create_function('&$ v,$ k,&$ t','$ t [] = $ v;'),&$ flattened); 函數定義被正確定義爲通過引用。但除非在通話期間通過引用傳遞,否則不起作用。 – jskulski 2010-04-28 20:21:01
@jskilski對象(本例中爲`$ objTmp`)自動通過引用傳遞;數組不是。嘗試使用匿名函數(http://php.net/manual/en/functions.anonymous.php)而不是`create_function`。 – dave1010 2011-08-31 11:57:24
非遞歸溶液(但順序摧毀):
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;
}
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;
}
// $array = your multidimensional array
$flat_array = array();
foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $k=>$v){
$flat_array[$k] = $v;
}
如果找你如果沒有數組鍵,那麼可以使用遞歸閉包作爲使用array_values()的回調來壓扁多維數組,如下所示,確保此回調是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()遠更多的代碼:
<?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);
這個例子似乎比前一個例子更好,隱藏了關於如何從多維數組中提取值的細節。當然,迭代會發生,但是否需要遞歸或控制結構,您只需要仔細閱讀array.c。由於函數式編程專注於輸入和輸出,而不是獲取結果的細節,所以人們可以不關心幕後迭代的發生,直到透視僱主提出這樣一個問題。
從PHP的user comments另一種方法(簡體)和here:
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;
}
這種方法的最大好處是,它跟蹤遞歸的深度,如果你需要,雖然扁平化。
這將輸出:
$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
)
在PHP> = 5。3並根據呂克·M的答案(第一個),你可以使用封閉的這樣
array_walk_recursive($aNonFlat, function(&$v, $k, &$t){$t->aFlat[] = $v;}, $objTmp);
我喜歡這個,因爲我沒有包圍功能的代碼使用create_function時喜歡引用()
基於混沌submited前面的例子功能,修復了的MultiArrays overwritting字符串鍵的錯誤的新方法:
# 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;
}
$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
下面是另一種解決方案(具有多維數組作品):
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是原始數組的關鍵字。
如果你感興趣的只是一個特定鍵的值,你會發現這種方法非常有用:
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
};
使用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));
任何這沒有爲我工作... 所以不得不自己運行它。 作品就好:
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>';
鑑於多維數組和將其轉換成一維的,可以通過取消其具有陣列並將其保存到第一維度中的所有值,例如進行:
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;
}
使用高階函數(注意:我使用inline anonymous functions,從而出現了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()
);
}
可以使用flatten函數來自Non-standard PHP library (NSPL)。它適用於數組和任何可迭代的數據結構。通過遞歸
assert([1, 2, 3, 4, 5, 6, 7, 8, 9] === flatten([[1, [2, [3]]], [[[4, 5, 6]]], 7, 8, [9]]));
簡單approach..See吧..
<?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);
?>
**請檢查該鏈接的解決方案**:http://stackoverflow.com/questions/14951811/i-want-添加子數組到一個單一的數組在PHP/14952110#14952110 – 2013-02-20 05:12:22
**另一個很好的參考問題**也許有更好的答案:[如何變平多維數組?](http:///stackoverflow.com/q/1319903/367456) – hakre 2015-04-03 06:12:40