2013-08-22 9 views
1

У меня есть массив записей БД, которые я хочу, чтобы преобразовать из этого:Извлечение идентификаторов из многомерного массива

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 или более поздней версии простейшим решением будет использование встроенной функции 10 PHP.

$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

Попробуйте this-

$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 Встроенные функции HP. Скорость зависит от оптимизации gcc-компилятора вашего исполняемого файла PHP.

Примечание:@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 [здесь] (http://stackoverflow.com/questions/10293378/what-is-the-most-efficient-way-of-merging-1-2-and-7-8 -в-1-7-2-8/17910641 # 17910641). Хотя, если вы можете себе это позволить, 'array_map' определенно является мощным и удобным выбором, который может использовать свое собственное распределение стека - конечно, управление тем, что« экстравагантность »- это крутой момент, когда дело доходит до скорости. –