質問

たとえば、データベースに照会しただけで、この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で公式の置換を使用できます。

https://github.com/ramsey/array_column

これはあなたが望むことをするだろうと思う

array_uintersect_uassoc

このようなことをする必要があります

$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;
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top