Отображение массива PHP

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

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


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

Ответ 1

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

Вы могли бы array_map его, но я бы придерживался необработанного PHP, который вы разместили выше... Это легче поддерживать и IMHO более читабельным...

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

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

vs

$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.

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

Ответ 2

Конечно, используйте 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);

Ответ 3

array_map('array_shift', $methods);

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

Ответ 4

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

$methodsLabel = array_map(function($item) { return $item['label']; }, $methods);

Ответ 6

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

array_map('current', $methods);