Cara mendapatkan array "kunci" tertentu dalam array multidimensi tanpa perulangan

115

Mari kita asumsikan saya memiliki array multidimensi berikut (diambil dari MySQL atau layanan):

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

Bisakah kita mendapatkan array ids dalam satu panggilan fungsi php " built-in "? atau satu baris kode?
Saya mengetahui perulangan tradisional dan mendapatkan nilainya tetapi saya tidak membutuhkan ini:

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

Mungkin beberapa array_map()dan call_user_func_array()bisa melakukan keajaiban.

ifaour
sumber
"Bisakah kita mendapatkan array id dalam satu pemanggilan fungsi?" ya, tetapi Anda harus menulis fungsinya
:)
@ BorisGuéry, saya berarti built-in fungsi :-)
ifaour
2
PS: Saya sadar saya bisa menulis foreach($users as $user) {$ids[] = $user['id'];}dalam satu baris! tetapi Anda tahu apa yang saya maksud / perlu :-)
ifaour
@ Eugene, saya jelas membutuhkan array untuk hal-hal lain. Dan lagi, ini hanya untuk bersenang-senang dan mempelajari singkatan baru dalam PHP.
ifaour

Jawaban:

261

Sejak php 5.5, Anda dapat menggunakan array_column:

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

Ini adalah opsi yang disukai pada proyek modern apa pun. Namun, jika Anda harus mendukung php> 5.5, ada alternatif berikut:

Sejak php 5.3, Anda dapat menggunakan array_mapdengan fungsi anonim, seperti ini:

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

Sebelum (Secara teknis php 4.0.6+) , Anda harus membuat fungsi anonim dengan create_function:

$ids = array_map(create_function('$ar', 'return $ar["id"];'), $users);
phihag
sumber
bagus, sekarang jika ada fungsi asli yang mirip dengan function ($ar) {return $ar['id'];}nilai kembalian kunci yang akan luar biasa! :-)
ifaour
1
nah, itu bukan fungsi "semua dalam satu", tetapi Penutup (Fungsi anonim) adalah konsep yang sangat kuat yang dapat digunakan untuk pemrosesan seperti itu, Anda lebih suka mengetahui cara menggunakannya.
Boris Guéry
Bagaimana jika saya ingin mendapatkan kuncinya juga? Misalkan: $ arr = ['ball' => ['basket' => 5]]; Saya ingin mendapatkan: $ ball = ['ball' => 5];
Angger
2
@Angger Maka Anda memiliki pertanyaan yang berbeda dari yang ini. Jangan ragu untuk menanyakannya selama Anda menyebutkan secara rinci perilaku apa yang Anda harapkan, misalnya apa yang akan terjadi jika masukannya ['ball' => ['golf' => 7, 'basket' => 5, 'soccer' => 6], 'shuttle' => ['badminton' => 1]].
phihag
Sejak PHP7.4 Anda dapat menggunakan array_mapdengan fungsi panah:$ids = array_map(fn ($ar) => $ar['id'], $users);
user3601546
13

PHP 5.5+

Memulai PHP5.5 + Anda memiliki array_column () tersedia untuk Anda, yang membuat semua di bawah ini menjadi usang.

PHP 5.3+

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

Solusi oleh @phihag akan bekerja dengan sempurna di PHP mulai dari PHP 5.3.0, jika Anda membutuhkan dukungan sebelum itu, Anda perlu menyalin wp_list_pluck itu.

PHP <5.3

Wordpress 3.1+

Di Wordpress ada fungsi yang disebut wp_list_pluck Jika Anda menggunakan Wordpress yang memecahkan masalah Anda.

PHP <5.3

Jika Anda tidak menggunakan Wordpress , karena kodenya adalah open source, Anda dapat menyalin dan menempelkan kode di proyek Anda (dan mengganti nama fungsinya menjadi sesuatu yang Anda sukai, seperti array_pick).Lihat sumber di sini

Norris
sumber
3

Jika id kunci pertama dalam larik, ini akan dilakukan:

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

Anda tidak harus bergantung pada ini. :)

menipu
sumber
-1

Anda juga bisa menggunakan array_reduce() jika Anda lebih suka pendekatan yang lebih fungsional

Misalnya:

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

Atau jika Anda ingin menjadi mewah,

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

Ini dan semua metode di atas melakukan perulangan di belakang layar;)

Muraguri E
sumber
Contoh pertama Anda tidak akan mengembalikan larik, hanya nilai terakhir yang ditemukan untuk $ user ['name'] dalam larik. Anda perlu mendorong / menambahkan $ carry dan mengembalikan $ carry saat Anda pergi.
Progrock