2013-08-22 42 views
1

我的分貝記錄數組,我想從這個轉換:提取IDS

array(2) { 
    [0]=> 
    array(1) { 
    ["ID"]=> 
    string(1) "2" 
    } 
    [1]=> 
    array(1) { 
    ["ID"]=> 
    string(1) "3" 
    } 
} 

要這樣:

array(2) { 
    [0]=> 
    string(1) "2" 
    [1]=> 
    string(1) "3" 
} 

我在找最快的表演/最簡單的解決方案。

我找不到任何PHP函數。

回答

4

相同的效果在PHP 5.5或更高版本中,最簡單的解決方案是使用PHP內置的array_column()函數。

$ids = array_column($arr, 'ID'); 
+1

你確定你的參數是正確的嗎? ? –

+1

@ChrisForrence他們現在。 :) – kba

+1

很好的解決方案!但是,這隻能在PHP 5.5 + –

3
$bas = array(); 
foreach ($foo as $bar) { 
    $bas[] = $bar['ID']; 
} 

print_r($bas); 

$foo將你原有的陣列和$bas要將其轉換爲一個。

1

嘗試這個 -

$newArr = array(); 
foreach($array as $a) // $array is original array 
{ 
    array_push($newArr, $a["ID"]); 
} 
print_r($newArr); 
+2

提示:PHP有一個已經調用['array_column'](http://php.net/array_column)的函數。如果你沒有PHP 5.5,有一個等效的用戶區域:http://benramsey.com/blog/2013/07/the-array-column-php-userland-library/ – hakre

2

輸入數據(富含其他數據類型 - 因爲測試 - ),並假設你使用最新的PHP版本:

$input = array(
    0=> 
    array(
     "ID"=> "2" 
    ), 
    1=> 
    array(
     "ID"=> "3" 
    ), 
    "iamnotanarray", 100, null 
); 

示範:

$out = array_map(function($el){ return @current($el);}, $input); 

一般:

$out = array_combine(
    array_keys($ret) 
    ,array_map(function($el){ return @current($el);}, $ret) 
) 

輸出:

var_export($out); 

array (
    0 => '2', 
    1 => '3', 
    2 => NULL, 
    3 => NULL, 
    4 => NULL, 
) 

var_dump($out); 

array(5) { 
    [0]=> 
    string(1) "2" 
    [1]=> 
    string(1) "3" 
    [2]=> 
    NULL 
    [3]=> 
    NULL 
    [4]=> 
    NULL 
} 

要過濾潛在的有害數據類型,你可以使用:

$out = array_filter($out, is_string); 
var_dump($out); 
array(2) { 
    [0]=> 
    string(1) "2" 
    [1]=> 
    string(1) "3" 
} 

我沒火候(),但這是使用P惠普原生預編譯功能。速度因您的PHP可執行文件的gcc編譯器優化而異。

注意:@current髒,不推薦使用,只是爲了簡潔/易讀。它會產生與is_array($el) ? current($el) : NULL;

3

我寫了簡單的測試,尋找那些之間最好的解決辦法:

// foreach 
foreach ($array as $element) { $result[] = $element['ID']; } 
// array_map 
array_map(function($element) { return $element['ID']; }, $array); 
// array_push 
foreach ($array as $element) { array_push($result, $element['ID']); } 

結果:

Test name Repeats   Result   Performance  
foreach  1000   0,009204 sec +0% 
array_push 1000   0,015731 sec -70,915% 
array_map 1000   0,024891 sec -170,437% 

不時它們之間略有差別,但foreach總是最好的表現出色的成績。所以,似乎@campari的答案必須是最好的答案。但是我沒有測試@kba解決方案,因爲我在PHP 5.4上。我懷疑array_column算法會顯示出優越的結果。

測試代碼在這裏:link

+0

謝謝。我懷疑如此。查看JavaScript的'map'的性能數據[這裏](http://stackoverflow.com/questions/10293378/what-is-the-most-efficient-way-of-merging-1-2-and-7-8 -INTO-1-7-2-8/17910641#17910641)。但是,如果你能負擔得起,'array_map'絕對是一個強大和方便的選擇,可以利用它自己的堆棧分配 - 當然,管理這種「奢侈」是速度的關鍵。 –