ループせずに多次元配列の特定の「キー」の配列を取得する方法


115

次の多次元配列(MySQLまたはサービスから取得)があるとします。

array(
    array(
        [id] => xxx,
        [name] => blah
    ),
    array(
        [id] => yyy,
        [name] => blahblah
    ),
    array(
        [id] => zzz,
        [name] => blahblahblah
    ),
)

id1つの「組み込み」php関数呼び出しでの配列を取得できますか?または1行のコード?
私は伝統的なループと価値を得ることを知っていますが、これは必要ありません:

foreach($users as $user) {
    $ids[] = $user['id'];
}
print_r($ids);

多分いくつかarray_map()call_user_func_array()魔法を行うことができます。


「1回の関数呼び出しでIDの配列を取得できますか?」はい、しかし、あなたは関数を書く必要があります:)
ボリス・ゲリー

@BorisGuéry、私は組み込み関数を意味していました :-)
ifaour

2
PS:私はforeach($users as $user) {$ids[] = $user['id'];}一行で書けることを知っています!しかし、あなたは私が何を意味し/必要としているのか知っています:-)
ifaour

@Eugene、私は明らかに他のもののための配列が必要です。繰り返しになりますが、これは面白くてPHPの新しい省略表現を学ぶためだけのものです。
ifaour

回答:


261

PHP 5.5以降では、以下を使用できますarray_column

$ids = array_column($users, 'id');

これは、現代のプロジェクトで推奨されるオプションです。ただし、php> 5.5をサポートする必要がある場合は、次の代替策があります。

PHP 5.3以降array_map、次のように無名関数を使用できます。

$ids = array_map(function ($ar) {return $ar['id'];}, $users);

以前は(技術的にはphp 4.0.6+)create_function代わりに無名関数を作成する必要があります:

$ids = array_map(create_function('$ar', 'return $ar["id"];'), $users);

すばらしいです。keyのfunction ($ar) {return $ar['id'];}戻り値に似たネイティブ関数があるとしたら、それはすばらしいでしょう。:-)
ifaour

1
まあ、それは「オールインワン」関数ではありませんが、クロージャー(匿名関数)はそのような処理に使用できる非常に強力な概念であり、それらの使用方法を知りたいと思います。
BorisGuéry11年

キーも取得したい場合はどうなりますか?仮定:$ arr = ['ball' => ['basket' => 5]]; 取得したい:$ ball = ['ball' => 5];
Angger

2
@Angger次に、これとは別の質問があります。こと自由に感じ、それを聞いて入力された場合に生じるすべきか、たとえば、限り、あなたは何を期待行動を詳細に言及して['ball' => ['golf' => 7, 'basket' => 5, 'soccer' => 6], 'shuttle' => ['badminton' => 1]]
phihag 2017

PHP7.4以降array_map、アロー関数で使用できます:$ids = array_map(fn ($ar) => $ar['id'], $users);
user3601546

13

PHP 5.5以降

PHP5.5以降では、array_column()を使用できるため、以下のすべてが廃止されます。

PHP 5.3以降

$ids = array_map(function ($ar) {return $ar['id'];}, $users);

@phihagによるソリューションは、PHP 5.3.0以降のPHPで問題なく動作します。その前にサポートが必要な場合は、そのwp_list_pluckをコピーする必要があります。

PHP <5.3

Wordpress 3.1以降

Wordpressには、 問題を解決するWordpressを使用している場合、wp_list_pluckという関数があります。

PHP <5.3

Wordpressを使用していない場合は、コードがオープンソースであるため、コードをプロジェクトにコピーして貼り付けることができます(関数の名前をarray_pickなどの任意の名前に変更できます)。ここにソースを表示


3

idが配列の最初のキーである場合、これは次のようになります。

$ids = array_map('current', $users);

ただし、必ずしもこれに依存する必要はありません。:)


-1

あなたも使うことができます array_reduce()より機能的なアプローチを好む場合にできます

例えば:

$userNames = array_reduce($users, function ($carry, $user) {
    array_push($carry, $user['name']);
    return $carry;
}, []);

または、空想になりたい場合は、

$userNames = [];
array_map(function ($user) use (&$userNames){
    $userNames[]=$user['name'];
}, $users);

これと上記のすべてのメソッドは、舞台裏でループします;)


最初の例は配列を返さず、配列内の$ user ['name']で見つかった最後の値だけを返します。$ carryにpush / appendして、$ carryを返す必要があります。
Progrock
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.