要素の1つで多次元PHP配列をスライスする
-
03-07-2019 - |
質問
たとえば、データベースに照会しただけで、この2D配列を受け取ったとします。
$results = array(
array('id' => 1, 'name' => 'red' , 'spin' => 1),
array('id' => 2, 'name' => 'green', 'spin' => -1),
array('id' => 3, 'name' => 'blue' , 'spin' => .5)
);
よくこのようなループを書いています。
foreach($results as $result)
$names[] = $result['name'];
私の質問は、ループを使用せずにこの配列$ namesを取得する方法はありますか?コールバック関数の使用は、ループの使用としてカウントされます。
すべてのフィールドを取得するより一般的な例です。
foreach($results as $result)
foreach($result as $key => $value)
$fields[$key][] = $value;
解決
PHP-5.5の6月20日現在、新しい関数 array_column
があります。例:
$records = array(
array(
'id' => 2135,
'first_name' => 'John',
'last_name' => 'Doe'
),
array(
'id' => 3245,
'first_name' => 'Sally',
'last_name' => 'Smith'
),
array(
'id' => 5342,
'first_name' => 'Jane',
'last_name' => 'Jones'
),
array(
'id' => 5623,
'first_name' => 'Peter',
'last_name' => 'Doe'
)
);
$firstNames = array_column($records, 'first_name');
print_r($firstNames);
戻る
Array
(
[0] => John
[1] => Sally
[2] => Jane
[3] => Peter
)
上記のリンクにはさらに多くの例があります。
他のヒント
組み込み関数で求めていることを実際に行う方法がないため、@ Devonの回答に賛成票を投じました。できることは自分で書くことです:
function array_column($array, $column)
{
$ret = array();
foreach ($array as $row) $ret[] = $row[$column];
return $ret;
}
PHP 5.3以降では、ラムダ関数でこのきれいな呼び出しを使用できます。
$names = array_map(function ($v){ return $v['name']; }, $results);
これは、「name」ディメンションでスライスされた配列を返します。
簡単に言えば、いいえ。
array_walk のようなループまたはコールバック関数を使用する必要があります。
これについてさらに調査したところ、ルビーとプロトタイプの両方に、これを行う array_pluck 、 2 。 array_map
には、ここでやりたいことの逆を行うことができる2番目の用途があるのは興味深いことです。また、誰かが配列のプロトタイプ操作をエミュレートするために書いているPHP class を見つけました。
さらに掘り下げて、他に何も見つからない場合は、internals @ lists.php.netメーリングリストに送信して、array_pluckが追加されるかどうかを確認するパッチを作成します。
今すぐ PHP5.5
にアップグレードできず、この関数を必要とする人のために、 array_column
の実装があります。
function array_column($array, $column){
$a2 = array();
array_map(function ($a1) use ($column, &$a2){
array_push($a2, $a1[$column]);
}, $array);
return $a2;
}
5.5より前のバージョンのPHPおよび array_column()
を実行している場合、プレーンなPHPで公式の置換を使用できます。
これはあなたが望むことをするだろうと思う
このようなことをする必要があります
$results = array(
array('id' => 1, 'name' => 'red' , 'spin' => 1),
array('id' => 2, 'name' => 'green', 'spin' => -1),
array('id' => 3, 'name' => 'blue' , 'spin' => .5)
);
$name = array_uintersect_uassoc( $results, array('name' => 'value') , 0, "cmpKey");
print_r($name);
//////////////////////////////////////////////////
// FUNCTIONS
//////////////////////////////////////////////////
function cmpKey($key1, $key2) {
if ($key1 == $key2) {
return 0;
} else {
return -1;
}
}
ただし、PHP5にアクセスできないため、これをテストしていません。
できること:
$tmp = array_flip($names);
$names = array_keys($tmp);
これはarray_column()の高速な関数代替です
if(!function_exists('array_column')) {
function array_column($element_name) {
$ele = array_map(function($element) {
return $element[$element_name];
}, $a);
return $ele;
}
}