この質問は以前に尋ねられたと確信しています。最初に見つけられなかったことをお詫びします。
元の配列:
[0] => Array
(
[categoryId] => 1
[eventId] => 2
[eventName] => 3
[vendorName] => 4
)
[1] => Array
(
[categoryId] => 5
[eventId] => 6
[eventName] => 7
[vendorName] => 8
)
[2] => Array
(
[categoryId] => 9
[eventId] => 10
[eventName] => 11
[vendorName] => 12
)
次の結果を期待していました:print_r(get_values_from_a_key_in_arrays( 'categoryId'、$ array));
[0] => 1
[1] => 5
[2] => 9
独自のforeachベースの関数を作成するよりもクリーンなものを探しています。 foreachが答えである場合、私はすでにそれを実施しています。
編集:ハードコードされたキーは使用したくありません。ソリューションの呼び出し例を示しているだけです。ありがとう! ^ _ ^
PHP 5.3:のクイックグラブソリューション
private function pluck($key, $data) {
return array_reduce($data, function($result, $array) use($key) {
isset($array[$key]) && $result[] = $array[$key];
return $result;
}, array());
}
だから、 高階コレクション/イテレータ関数 のクールなこと pluck 、 filter 、 each 、 map 、そして友人は、それらを組み合わせて、より複雑な操作のセットを構成できるということです。
ほとんどの言語はこれらのタイプの関数を提供します(コレクション、イテレーター、または列挙型/列挙型などのパッケージを探します)...他の言語よりも多くの関数を提供するものもあり、関数の名前が言語間で異なることがよくあります(つまり、collect == map、削減==フォールド)。関数 お使いの言語に存在しない場合は、作成できます 存在する関数から。
テストケースに関しては... array_reduce を使用してpluckを実装できます。私が投稿した最初のバージョンはarray_map
に依存していました。ただし、私は @ salathe に同意します array_reduce はこのタスクに対してより簡潔です。 array_map はOKオプションですが、最終的にはさらに多くの作業を行う必要があります。 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
"pluck" for PHP 5.3+: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());
}
"pluck" for PHP 5.3+: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');
}
レガシーの「pluck」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、これはPHP 5.5 as array_column として追加されているようです。
マッピングはあなたが必要とするものです:
$input = array(
array(
'categoryId' => 1,
'eventId' => 2,
'eventName' => 3,
'vendorName' => 4,
),
array(
'categoryId' => 5,
'eventId' => 6,
'eventName' => 7,
'vendorName' => 8,
),
array(
'categoryId' => 9,
'eventId' => 10,
'eventName' => 11,
'vendorName' => 12,
),
);
$result = array_map(function($val){
return $val['categoryId'];
}, $input);
または、必要な関数を作成します。
function get_values_from_a_key_in_arrays($key, $input){
return array_map(function($val) use ($key) {
return $val[$key];
}, $input);
};
そしてそれを使用する:
$result = get_values_from_a_key_in_arrays('categoryId', $array);
PHP> = 5.3で動作し、匿名コールバックが許可されます。以前のバージョンでは、コールバックを以前に定義し、匿名関数の代わりにその名前を渡す必要があります。
このための組み込み関数はありませんが、通常は「 pluck "」と呼ばれます。
<?php
$a = array(
array('a' => 1, 'b' => 2),
array('a' => 2, 'b' => 2),
array('a' => 3, 'b' => 2),
array('a' => 4, 'b' => 2)
);
function get_a($v) {
return $v['a'];
}
var_dump(array_map('get_a', $a));
Create_functionまたは無名関数を使用できます(PHP 5.3> =)
<?php
$a = array(
array('a' => 1, 'b' => 2),
array('a' => 2, 'b' => 2),
array('a' => 3, 'b' => 2),
array('a' => 4, 'b' => 2)
);
var_dump(array_map(create_function('$v', 'return $v["a"];'), $a));
上記のようにコールバック関数を記述し、それをarray_mapで使用します。
組み込み関数はありません。しかし、1つはarray_map()
で簡単に作成できます。
$array = array(
array(
"categoryID" => 1,
"CategoryName" => 2,
"EventName" => 3,
"VendorName" => 4
),
array(
"categoryID" => 5,
"CategoryName" => 6,
"EventName" => 7,
"VendorName" => 8
),
array(
"categoryID" => 9,
"CategoryName" => 10,
"EventName" => 11,
"VendorName" => 12
)
);
$newArray = array_map(function($el) {
return $el["categoryID"];
}, $array);
var_dump($newArray);
PHP 5.5の時点で、 array_column
:
$events = [
[ 'categoryId' => 1, 'eventId' => 2, 'eventName' => 3, 'vendorName' => 4 ],
[ 'categoryId' => 5, 'eventId' => 6, 'eventName' => 7, 'vendorName' => 8 ],
[ 'categoryId' => 9, 'eventId' => 10, 'eventName' => 11, 'vendorName' => 12 ],
];
print_r(array_column($events, 'categoryId'));
5.5より前のバージョンでは、 polyfill の使用を検討できます。
必要なときにLISPはどこにありますか?実際、phpでは管理も非常に簡単です。以下に示すように、array_map関数を使用するだけです。
# bunch o data
$data = array();
$data[0] = array("id" => 100, "name" => 'ted');
$data[1] = array("id" => 200, "name" => 'mac');
$data[2] = array("id" => 204, "name" => 'bub');
# what you want to do to each bit of it
function pick($n) { return($n['id']); }
# what you get after you do that
$map = array_map("pick", $data);
# see for yourself
print_r($map);
array_filter を使用して、目的のキーに基づいて関数を渡すことができます。
しかし、タデックの答えははるかに優れています。