2011-08-21 74 views
0

我想我把你帶走了標題。但這裏是我究竟需要:將數組中的「類型數組」元素中的數據合併到一個新數組中

我有一個這樣的數組:

array(
'0' => array('the','data','i'), 
'1' => array('need', 'is', 'this'), 
'2' => array('complete', 'sentence') 
); 

,我想成爲:

array(
'the','data','i','need','is','this','complete','sentence' 
); 

什麼是隨機:

  1. 數子元素中的元素。
  2. 子數組元素的數量。
+1

可能的欺騙:http://stackoverflow.com/questions/526556/how-to-flatten -a-multi-dimensional-array-to-simple-in-php –

+0

那裏的解決方案能夠處理超過10k個元素(總數)嗎? – kapeels

+0

好問題,@KPL。那裏的解決方案確實考慮了數組嵌套到任意深度的一般情況。如果您只想在頂層進行合併,那麼您可以在不使用遞歸的情況下寫更高效的東西。 –

回答

2

由於您提出的問題似乎不是遞歸壓縮的一般問題,因此儘管其他SO問題解決了一般情況,但可能值得在此提供簡單解決方案作爲答案。

所有你需要的是

call_user_func_array("array_merge", $a); 

要看到它在一個完整的腳本:

<?php 
$a = array(
    array('the',' data', 'i'), 
    array('need', 'is', 'this'), 
    array('complete', 'sentence') 
); 

echo var_dump($a); 
echo "<br/><br/><br/>"; 
$b = call_user_func_array("array_merge", $a); 
echo var_dump($b); 
?> 

這通過附加陣列積聚的結果,可能是低效的。您可以查看SplFixedArray,它允許您預先分配空間。然後遍歷原始數組中的組成數組並加載結果。這裏是討論SplFixedArray博客文章,包括時序結果:http://www.johnciacia.com/2011/02/01/array-vs-splfixedarray/

這裏是一個詳細的版本:

<?php 
$a = array(
    array('the','data','i'), 
    array('need', 'is', 'this'), 
    array('complete', 'sentence') 
); 

$size = 0; 
foreach ($a as $subarray) { 
    $size += count($subarray); 
} 

$result = new SplFixedArray($size); 
# If you do not have SPL, just use $result = Array(); and write to a high index first (probably) 

$i = 0; 
foreach ($a as $subarray) { 
    foreach ($subarray as $value) { 
     $result[$i++] = $value; 
    } 
} 

echo var_dump($result); 
?> 
+0

但是,'array_values'不能達到同樣的目的嗎? – kapeels

+0

['array_values'](http://php.net/manual/en/function.array-values.php)函數只是產生一個數字索引的數組,忽略鍵。我不明白它是如何幫助扁平化的,但這並不意味着它不能被使用。 –

相關問題