21

Say for example you just queried a database and you recieved this 2D array.

$results = array(
    array('id' => 1, 'name' => 'red'  , 'spin' =>  1),
    array('id' => 2, 'name' => 'green', 'spin' => -1),
    array('id' => 3, 'name' => 'blue' , 'spin' => .5)
);

I often find myself writing loops like this.

foreach($results as $result)
    $names[] = $result['name'];

My questions is does there exist a way to get this array $names without using a loop? Using callback functions count as using a loop.

Here is a more generic example of getting every field.

foreach($results as $result)
    foreach($result as $key => $value)
        $fields[$key][] = $value;
4

11 に答える 11

23

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
)

上記のリンクにはさらに多くの例があります。

于 2013-03-21T18:51:53.637 に答える
14

組み込み関数であなたが求めていることを実際に行う方法がないため、@ Devonの応答に投票しました。あなたができる最善のことは、あなた自身を書くことです:

function array_column($array, $column)
{
    $ret = array();
    foreach ($array as $row) $ret[] = $row[$column];
    return $ret;
}
于 2008-10-02T17:13:38.587 に答える
7

PHP 5.3 以降では、ラムダ関数で次の pretty 呼び出しを使用できます。

$names = array_map(function ($v){ return $v['name']; }, $results);

これは、'name' 次元でスライスされた配列を返します。

于 2012-11-26T09:04:51.053 に答える
5

簡単に言えば、違います。

ループまたはarray_walkのようなコールバック関数を使用する必要があります。

于 2008-10-02T16:55:30.347 に答える
2

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;
}
于 2013-10-04T18:15:16.760 に答える
2

これについてさらに調査したところ、ruby とプロトタイプの両方に、これを行う array_pluck 2 という関数があることがわかりましarray_mapここでやりたいことの逆を行うことができる 2 番目の用途があるのは興味深いことです。また、配列のプロトタイプ操作をエミュレートするために誰かが書いている PHPクラスも見つけました。

もっと調べてみて、他に何も見つからなければ、パッチを作成して internals@lists.php.net メーリング リストに提出し、array_pluck が追加されるかどうかを確認します。

于 2008-10-03T23:07:25.703 に答える
1

5.5 より前のバージョンの PHP を実行している場合はarray_column()、プレーンな PHP で公式の置き換えを使用できます。

https://github.com/ramsey/array_column

于 2014-07-07T17:38:09.107 に答える
0

私はこれがあなたが望むことをすると思います

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 にアクセスできないため、これをテストしていません。

于 2008-10-02T19:12:05.963 に答える
0

あなたがすることができます:

$tmp = array_flip($names);
$names = array_keys($tmp);
于 2013-03-26T19:08:41.313 に答える