web-dev-qa-db-ja.com

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'];
}
16
powtac

PHP 5.5+の時点で、これはまさにそれです array_column() =します:

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

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


3v4lの例: https://3v4l.org/ZabAb

8
autonymous

いいえ、実装したコードよりも速い方法はありません。他のすべてのメソッドは、関数呼び出しのオーバーヘッドのために遅くなります。小さな配列の場合、違いはわずかですが、大きな配列(実装によっては100メンバー程度)の場合、違いは非常に大きくなる可能性があります...

array_mapすることもできますが、上記で投稿した生のPHP)を使用します...保守が簡単で、私見が読みやすくなります...

結局のところ、どれを教えてください一目でそれがもっと何をするかを教えてくれます:

$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の二重の勝利になります。

コードは必要なだけエレガントにする必要があります。それは何よりも読みやすいはずです...

26
ircmaxell

確かに、使用してください 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);
16
Jacob Relkin
array_map('array_shift', $methods);

ここでは、ラベルが各配列の最初の要素になると想定しています。

5
Gaurav

PHP 5.3+では、array_mapと組み合わせた無名関数を使用できます。

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

Labelが配列の最初の要素である場合、 array_map の "current"は正常に機能します。

array_map('current', $methods); 
2
Ravi Hirani

矢印関数 はPHP 7.4に導入されました。これにより、これが少しクリーンになります。

$methodsLabel = array_map(fn($x) => $x['label'], $methods)
1
Gary Thomas