Saya punya berbagai objek kucing:
$cats = Array
(
[0] => stdClass Object
(
[id] => 15
),
[1] => stdClass Object
(
[id] => 18
),
[2] => stdClass Object
(
[id] => 23
)
)
dan saya ingin mengekstrak array ID kucing dalam 1 baris (bukan fungsi atau loop).
Saya sedang berpikir untuk menggunakan array_walk
with create_function
tapi saya tidak tahu bagaimana melakukannya.
Ada ide?
Jawaban:
Jika Anda memiliki PHP 5.5 atau yang lebih baru , cara terbaik adalah menggunakan fungsi bawaan
array_column()
:Tetapi putranya harus berupa array atau diubah menjadi array
sumber
array_column
tidak bekerja denganarray
dariobject
s sama sekali. Karena PHP 7.0.0 dimungkinkan: stackoverflow.com/a/23335938/655224Anda bisa menggunakan
array_map()
fungsinya.Ini harus melakukannya:
sumber
$project_names = array_map(function($project) { return $project->name ;}, $projects );
Namun, dicatat dalam posting blog ini bahwa cara ini bisa menjadi 2,5 kali lebih lambat / intensif memori.create_function
memori tumbuh. Jika Anda menulis program dengan loop tak terbatas dan memanggilarray_map
dengancreate_function
di dalamnya, Anda akan selalu mendapatkanOut of memory...
kesalahan kapan saja. Jadi jangan gunakancreate_function
dan gunakanarray_map(function($o) { return $o->id; }, $objects);
Solusinya tergantung pada versi PHP yang Anda gunakan. Setidaknya ada 2 solusi:
Pertama (Versi PHP yang lebih baru)
Seperti yang dikatakan @JosepAlsina sebelumnya, solusi terbaik dan terpendek adalah menggunakan
array_column
sebagai berikut:Perhatian: Untuk iterasi es yang
array
mengandung\stdClass
seperti yang digunakan dalam pertanyaan itu hanya mungkin dengan versi PHP>= 7.0
. Tetapi ketika menggunakan yangarray
mengandungarray
Anda dapat melakukan hal yang sama sejak PHP>= 5.5
.Kedua (Versi PHP yang lebih lama)
@Greg mengatakan dalam versi PHP yang lebih lama dimungkinkan untuk melakukan hal berikut:
Namun berhati-hatilah: Dalam versi PHP yang lebih baru
>= 5.3.0
, lebih baik menggunakanClosure
s, seperti berikut:Perbedaan
Solusi pertama membuat fungsi baru dan memasukkannya ke dalam RAM Anda. Pengumpul sampah tidak menghapus instance fungsi yang sudah dibuat dan sudah dipanggil dari memori karena beberapa alasan. Dan terlepas dari faktanya, bahwa instance fungsi yang dibuat tidak akan pernah bisa dipanggil lagi, karena kita tidak memiliki pointer untuk itu. Dan saat kode ini dipanggil, fungsi yang sama akan dibuat lagi. Perilaku ini perlahan mengisi ingatan Anda ...
Kedua contoh dengan keluaran memori untuk membandingkannya:
BURUK
BAIK
Ini juga dapat didiskusikan di sini
Kebocoran memori ?! Apakah Pengumpul Sampah melakukan dengan benar saat menggunakan 'create_function' dalam 'array_map'?
sumber
array_column
pada larik ini, ia selalu mengembalikan kosong sedangkan cuplikan INI berfungsi dengan benar, keduanya memiliki properti terlindungi yang dapat diakses di cuplikan kedua hanya. Saya tidak bisa menemukan alasan lain selain namespace.object
dalam solusi saya, maksud sayaobject
bukanObject
. Huruf kecilobject
menggambarkan objek sederhana\stdClass
. Mungkin itu masalahnya. Apakah AndaObject
punyatoArray
metode? Gunakan ini. Sederhanaobject
danarray
hampir sama. Berikut invarian harus valid:((object)(array)$o) === $o
. Saat menerapkan__get
metode, Anda akan membuat properti kelas Anda dapat diakses oleh semua orang. Ini bisa menjadi perilaku yang diharapkan. Tetapi Anda juga dapat mengulangiarray<Object>
mis Anda denganarray_map
dan menelepontoArray
(jika ada) dan kemudian TI juga berfungsidan gunakan dalam satu baris :
sumber
array_walk
.KODE
KELUARAN
Saya tahu ini menggunakan loop, tetapi ini cara termudah untuk melakukannya! Dan menggunakan fungsi itu masih berakhir pada satu baris.
sumber
Anda dapat melakukannya dengan mudah dengan camilan ouzo
atau dengan Array (dari barang ouzo)
Lihat: http://ouzo.readthedocs.org/en/latest/utils/functions.html#extract
Lihat juga pemrograman fungsional dengan ouzo (Saya tidak dapat memposting tautan).
sumber
Loop bawaan di PHP lebih cepat daripada loop yang diinterpretasikan, jadi masuk akal untuk membuat yang satu ini menjadi satu baris:
sumber
sumber
Keluaran : [1, 2]
sumber
The
create_function()
fungsi ditinggalkan pada php v7.2.0 . Anda dapat menggunakanarray_map()
seperti yang diberikan,Alternatifnya, Anda dapat menggunakan
array_column()
fungsi yang mengembalikan nilai dari satu kolom input, yang diidentifikasi oleh kunci_kolom. Secara opsional, kunci_indeks dapat disediakan untuk mengindeks nilai dalam larik yang dikembalikan dengan nilai dari kolom kunci_indeks dari larik masukan. Anda dapat menggunakan array_column seperti yang diberikan,sumber