2010-05-28 19 views
5

是否有任何快速的方法來壓扁數組並選擇子鍵(在這種情況下'key'&'value')而不運行foreach循環,或者foreach始終是最快的方法?PHP:flatten數組 - 最快的方式?

Array 
(
    [0] => Array 
     (
      [key] => string 
      [value] => a simple string 
      [cas] => 0 
     ) 

    [1] => Array 
     (
      [key] => int 
      [value] => 99 
      [cas] => 0 
     ) 

    [2] => Array 
     (
      [key] => array 
      [value] => Array 
       (
        [0] => 11 
        [1] => 12 
       ) 

      [cas] => 0 
     ) 

) 

要:

Array 
(
    [int] => 99 
    [string] => a simple string 
    [array] => Array 
     (
      [0] => 11 
      [1] => 12 
     ) 
) 
+3

重複:http://stackoverflow.com/questions/1319903/how-to-flatten-a-multidimensional-array我想這個答案將幫助您最:http://stackoverflow.com/questions/1319903/how-to-flatten-a-multidimensional-array/1320156#1320156 – 2010-05-28 16:46:53

+0

任何理由讓它「最快」? – 2010-05-28 17:02:27

+0

任何你不想使用'foreach'的原因? – salathe 2010-05-28 17:47:05

回答

3

給這一個鏡頭:

$ret = array(); 
while ($el = each($array)) { 
    $ret[$el['value']['key']] = $el['value']['value']; 
} 
+1

哦,是什麼古老的運營商:) – 2010-05-28 17:01:59

+0

我會推薦總是初始化數組迭代器使用'重置($陣列)'就在迭代之前,以避免另一個電話,例如'end()'會和它混淆。很多方法來陷阱... – 2013-02-18 17:29:09

+0

試試這個解決方案:http://stackoverflow.com/a/1320259/1847769 – t1gor 2014-02-24 17:53:08

3

call_user_func_array("array_merge", $subarrays)可以用來 「壓平」 嵌套數組。
你想要的是完全不同的東西。您可以使用array_walk()進行回調,而不是將數據提取爲所需的格式。但是,不,foreach循環仍然更快。否則沒有array_*方法來實現您的結構。

+0

array_walk本身不會工作,因爲它不會返回任何東西,除了一個布爾(和你不能修改數組的鍵)。 – ircmaxell 2010-05-28 17:04:16

-1

這應該正確地將數組與整數鍵組合。如果密鑰是連續的並從零開始,它們將被丟棄。如果一個整數鍵在flat數組中不存在,它將保持不變;這應該主要保留非連續的數組。

function array_flatten(/* ... */) 
{ 
    $flat = array(); 
    array_walk_recursive(func_get_args(), function($value, $key) 
    { 
     if (array_key_exists($key, $flat)) 
     { 
      if (is_int($key)) 
      { 
       $flat[] = $value; 
      } 
     } 
     else 
     { 
      $flat[$key] = $value; 
     } 
    }); 
    return $flat; 
} 

你可以使用!isset($key)empty($key)轉而青睞有用的值。

這裏有一個更簡潔的版本:

function array_flatten(/* ... */) 
{ 
    $flat = array(); 
    array_walk_recursive(func_get_args(), function($value, $key) use (&$flat) 
    { 
     $flat = array_merge($flat, array($key => $value)); 
    }); 
    return $flat; 
}