したがって、pluck、filter、each、map 、friendsなどの高階 コレクション/イテレーター関数の優れた点は、それらを組み合わせて、より複雑な一連の操作を構成できることです。
ほとんどの言語はこれらのタイプの関数を提供します(コレクション、イテレーター、列挙/列挙可能などのパッケージを探します)...一部の言語は他の言語よりも多くの関数を提供し、関数の名前は言語間で異なることがよくあります(つまり、collect == map、削減==フォールド)。ご使用の言語に関数が存在しない場合は、存在する関数から関数を作成できます。
テストケースに関しては...array_reduceを使用してpluckを実装できます。私が投稿した最初のバージョンは;に依存していました。ただし、このタスクではarray_reduceの方が簡潔であるという@salatheに同意します。array_mapはOKオプションですが、最終的にはさらに多くの作業を行う必要があります。最初は少し奇妙に見えるかもしれませんが、コールバックがきちんと整理されていれば、すべてうまくいきます。array_map
array_reduce
あまりナイーブpluck
ではない場合も、反復値を「呼び出す」(関数/メソッド)ことができるかどうかを確認します。以下の単純な実装では、構造がハッシュ(連想配列)であると想定しています。
これにより、テストケースデータ(フィクスチャ)がセットアップされます。
<?php
$data[] = array('categoryId' => 1, 'eventId' => 2, 'eventName' => 3, 'vendorName' => 4);
$data[] = array('categoryId' => 5, 'eventId' => 6, 'eventName' => 7, 'vendorName' => 8);
$data[] = array('categoryId' => 9, 'eventId' => 10, 'eventName' => 11, 'vendorName' => 12);
$data[] = array(/* no categoryId */ 'eventId' => 10, 'eventName' => 11, 'vendorName' => 12);
$data[] = array('categoryId' => false,'eventId' => 10, 'eventName' => 11, 'vendorName' => 12);
$data[] = array('categoryId' => 0.0, 'eventId' => 10, 'eventName' => 11, 'vendorName' => 12);
好みのプルックのバージョンを選択してください
$preferredPluck = 'pluck_array_reduce'; // or pluck_array_map
PHP 5.3以降の「pluck」:array_reduceは簡潔な実装を提供しますが、array_mapバージョンほど簡単に推論することはできません。
function pluck_array_reduce($key, $data) {
return array_reduce($data, function($result, $array) use($key){
isset($array[$key]) &&
$result[] = $array[$key];
return $result;
}, array());
}
PHP 5.3以降の「pluck」:array_mapはこれに完全ではないため、さらにチェックを行う必要があります(それでも、多くの潜在的なケースは考慮されていません)。
function pluck_array_map($key, $data) {
$map = array_map(function($array) use($key){
return isset($array[$key]) ? $array[$key] : null;
}, $data);
// is_scalar isn't perfect; to make this right for you, you may have to adjust
return array_filter($map, 'is_scalar');
}
レガシーPHP<5.3の「プル」
従来のcreate_functionを使用することもできます。しかし、それは悪い形であり、推奨されておらず、またまったくエレガントでもないので、私はそれを見せないことにしました。
function pluck_compat($key, $data) {
$map = array();
foreach ($data as $array) {
if (array_key_exists($key, $array)) {
$map[] = $array[$key];
}
}
unset($array);
return $map;
}
ここでは、実行しているPHPのバージョンに基づいて呼び出す「pluck」のバージョンを選択します。スクリプト全体を実行すると、使用しているバージョンに関係なく、正しい答えが得られるはずです。
$actual = version_compare(PHP_VERSION, '5.3.0', '>=')
? $preferredPluck('categoryId', $data)
: pluck_compat('categoryId', $data);
$expected = array(1, 5, 9, false, 0.0);
$variance = count(array_diff($expected, $actual));
var_dump($expected, $actual);
echo PHP_EOL;
echo 'variance: ', $variance, PHP_EOL;
print @assert($variance)
? 'Assertion Failed'
: 'Assertion Passed';
末尾の「?>」がないことに注意してください。それは必要ないからです。そのままにしておくよりも、そのままにしておくほうがよいでしょう。
FWIW、これはarray_columnとしてPHP5.5に追加されているようです。