Сопоставление массивов PHP - PullRequest
15 голосов
/ 24 февраля 2011

Есть ли более чистый способ, чем foreach, получить массив всех значений "label"?

$methods[0]['label'] = 'test';
$methods[0]['nr']    = 99;
$methods[1]['label'] = 'whatever';
$methods[1]['nr']    = 10;


foreach($methods as $method) {
    $methodsLabel[] = $method['label'];
}

Ответы [ 6 ]

25 голосов
/ 24 февраля 2011

Нет, нет более быстрого способа, чем ваш реализованный код. Все другие методы будут медленнее из-за накладных расходов при вызове функции. Для небольшого массива разница будет тривиальной, но для большого (около 100 элементов или около того, в зависимости от реализации) разница может быть огромной ...

Вы могли бы array_map это, но я бы придерживался необработанного PHP, который вы разместили выше ... Его легче поддерживать и ИМХО более читабельно ...

В конце концов, скажите мне, какой с первого взгляда говорит вам, что он делает больше:

$results = array();
foreach ($array as $value) {
    $results[] = $value['title'];
}

против

$results = array_map(function($element) {
        return $element['title'];
    },
    $array
);

Или:

$callback = function($element) {
    return $element['title'];
}
$results = array_map($callback, $array);

Лично первый делает это для меня лучше всего. Это сразу очевидно, не зная ничего что он делает. Другие требуют знания array_map семантики, чтобы понять. Соедините это с тем фактом, что array_map медленнее , и это двойная победа для foreach.

Код должен быть настолько элегантным, насколько это необходимо. Это должно быть читаемым, прежде всего ...

16 голосов
/ 24 февраля 2011

Конечно, используйте array_map:

function getLabelFromMethod($method) {
   return $method['label'];
}

$labels = array_map('getLabelFromMethod', $methods);

Если вы используете PHP 5.3+, вы также можете использовать лямбда-функцию:

$labels = array_map(function($m) {
   return $m['label'];
}, $methods);
8 голосов
/ 06 февраля 2014

Начиная с PHP 5.5+, именно это array_column() делает:

$methodsLabel = array_column($methods, 'label');

http://php.net/manual/function.array-column.php


Пример 3v4l: https://3v4l.org/ZabAb

5 голосов
/ 24 февраля 2011
array_map('array_shift', $methods);

Здесь предполагается, что метка будет первым элементом каждого массива.

4 голосов
/ 24 февраля 2011

В PHP 5.3+ вы можете использовать анонимную функцию в паре с array_map.

$methodsLabel = array_map(function($item) { return $item['label']; }, $methods);
2 голосов
/ 07 июня 2016

Если метка является первым элементом в массиве, тогда «current» с array_map будет работать нормально.

array_map('current', $methods); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...