2009-02-08 120 views
58

這可能是初學者的問題,但我已經通過文檔更長的時間了,我找不到任何解決方案。我認爲我可以在每個維度上使用implode,然後將這些字符串與str_split重新組合以創建新的簡單數組。然而,我永遠不知道如果加入模式不是也在價值觀,所以在做了str_split我的原始價值可能會打破。如何將多維數組「扁平化」爲簡單的PHP?

對於多維數組內的數組是否有像combine($array1, $array2)

+0

**請檢查該鏈接的解決方案**:http://stackoverflow.com/questions/14951811/i-want-添加子數組到一個單一的數組在PHP/14952110#14952110 – 2013-02-20 05:12:22

+1

**另一個很好的參考問題**也許有更好的答案:[如何變平多維數組?](http:///stackoverflow.com/q/1319903/367456) – hakre 2015-04-03 06:12:40

回答

40

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) 
} 
*/ 

?> 
+2

謝謝!我下次可能也應該檢查用戶註釋。 – Adriana 2009-02-08 23:11:25

+0

有沒有人知道爲什麼這不起作用,除非我使用(折舊)的通話時間通過引用。 array_walk_recursive($ array,create_function('&$ v,$ k,&$ t','$ t [] = $ v;'),&$ flattened); 函數定義被正確定義爲通過引用。但除非在通話期間通過引用傳遞,否則不起作用。 – jskulski 2010-04-28 20:21:01

+2

@jskilski對象(本例中爲`$ objTmp`)自動通過引用傳遞;數組不是。嘗試使用匿名函數(http://php.net/manual/en/functions.anonymous.php)而不是`create_function`。 – dave1010 2011-08-31 11:57:24

3

非遞歸溶液(但順序摧毀):

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; 
} 
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; 
} 
1

如果找你如果沒有數組鍵,那麼可以使用遞歸閉包作爲使用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); 

參見live code

這個例子似乎比前一個例子更好,隱藏了關於如何從多維數組中提取值的細節。當然,迭代會發生,但是否需要遞歸或控制結構,您只需要仔細閱讀array.c。由於函數式編程專注於輸入和輸出,而不是獲取結果的細節,所以人們可以不關心幕後迭代的發生,直到透視僱主提出這樣一個問題。

5

從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 
) 
4

在PHP> = 5。3並根據呂克·M的答案(第一個),你可以使用封閉的這樣

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

我喜歡這個,因爲我沒有包圍功能的代碼使用create_function時喜歡引用()

1

基於混沌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); 
1
/*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; 
} 
1

你可以試試這個:

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; 
} 
102
$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); 
35

這是一條線,SUPER容易使用

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

非常容易理解,在匿名函數/ closure中$ v是值,$ k是原始數組的關鍵字。

0

如果你感興趣的只是一個特定鍵的值,你會發現這種方法非常有用:

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 
}; 
3

使用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

0

任何這沒有爲我工作... 所以不得不自己運行它。 作品就好:

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>'; 
0

鑑於多維數組和將其轉換成一維的,可以通過取消其具有陣列並將其保存到第一維度中的所有值,例如進行:

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; 
} 
2

使用高階函數(注意:我使用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() 
    ); 
} 
0

可以使用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]])); 
0

簡單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); 

?> 
相關問題