Sering terjadi pada saya untuk menangani data yang bisa berupa array atau variabel nol dan untuk memberi makan beberapa foreach
dengan data ini.
$values = get_values();
foreach ($values as $value){
...
}
Saat Anda memberi makan foreach dengan data yang bukan array, Anda mendapatkan peringatan:
Peringatan: Argumen tidak valid diberikan untuk foreach () di [...]
Dengan asumsi itu tidak mungkin untuk memperbaiki get_values()
fungsi untuk selalu mengembalikan array (kompatibilitas ke belakang, tidak tersedia kode sumber, apa pun alasan lain), saya bertanya-tanya yang merupakan cara paling bersih dan paling efisien untuk menghindari peringatan ini:
- Casting
$values
ke array - Inisialisasi
$values
ke array - Membungkus
foreach
denganif
- Lainnya (harap disarankan)
$values
bukan array.Jawaban:
Secara pribadi saya menemukan ini sebagai yang paling bersih - tidak yakin apakah ini yang paling efisien, pikiran!
Alasan untuk preferensi saya adalah karena tidak mengalokasikan array kosong ketika Anda tidak punya apa-apa untuk memulai.
sumber
count()
tidak dapat diandalkan. Jika Anda luluscount()
nol, ia mengembalikan 0. Jika Anda memberikan argumen non-null, non-array, mengembalikan 1. Oleh karena itu tidak mungkin digunakancount()
untuk menentukan apakah variabel tersebut adalah array ketika variabel bisa berupa array kosong, atau sebuah array yang mengandung 1 item.if (is_array($values) || $values instanceof Traversable)
.Bagaimana dengan yang ini? lebih bersih dan semua dalam satu baris.
sumber
isset()
atauis_array()
atau keduanya, sepenuhnya tergantung pada skenario Anda dll.Saya biasanya menggunakan konstruksi yang mirip dengan ini:
Perhatikan bahwa versi khusus ini tidak diuji, diketik langsung ke dalam SO dari memori.
Edit: menambahkan pemeriksaan Traversable
sumber
$var instanceof Traversable
. Lihat di sini . Karena misalnya Anda dapat melakukan pendahuluan SimpleXMLElement , tetapi itu bukan turunan dari Iterator atau IteratorAggregate.is_object($var)
kembali. php.net/manual/en/language.oop5.iterations.phpIterator
atauIteratorAggregate
, tapi itu tentu saja hanya pendapat saya dan karenanya subyektif (saya tidak pernah menggunakan bidang publik).Tolong jangan bergantung pada casting sebagai solusi , meskipun yang lain menyarankan ini sebagai opsi yang valid untuk mencegah kesalahan, itu mungkin menyebabkan yang lain.
Berhati-hatilah: Jika Anda mengharapkan bentuk array tertentu dikembalikan, ini mungkin gagal. Diperlukan lebih banyak cek untuk itu.
Saya menulis tes cepat untuk menyajikan masalah ini . (Berikut ini adalah Tes cadangan jika url tes pertama gagal.)
Termasuk tes untuk:
null
,false
,true
, seorangclass
, sebuaharray
danundefined
.Selalu uji input Anda sebelum menggunakannya di foreach. Saran:
$array = is_array($var) or is_object($var) ? $var : [] ;
try{}catch(){}
balokarray_key_exists
pada kunci tertentu, atau menguji kedalaman array (ketika itu adalah satu!) .sumber
Coba ini:
;)
sumber
Masalahnya selalu nol dan Casting sebenarnya adalah solusi pembersihan.
sumber
Pertama-tama, setiap variabel harus diinisialisasi. Selalu.
Casting bukanlah suatu pilihan.
jika get_values (); dapat mengembalikan variabel tipe yang berbeda, nilai ini harus diperiksa, tentu saja.
sumber
$array = (array)null;
Anda mendapatkan array kosong. Tentu saja itu buang-buang alokasi memori ;-)Ekstensi kode @ Kris yang lebih singkat
terutama untuk menggunakan kode templat di dalam
sumber
return is_iterable($var) ? $var : array($var);
?Jika Anda menggunakan php7 dan Anda hanya ingin menangani kesalahan yang tidak terdefinisi, ini adalah IMHO terbersih
sumber
Ini tidak memeriksa apakah array, tetapi melewatkan loop jika variabelnya null atau array kosong.
sumber
Saya tidak yakin apakah ini masalahnya tetapi masalah ini tampaknya terjadi beberapa kali saat memigrasi situs wordpress atau memigrasi situs dinamis secara umum. Jika demikian, pastikan hosting tempat Anda bermigrasi menggunakan versi PHP yang sama dengan yang digunakan situs lama Anda.
Jika Anda tidak memigrasikan situs Anda dan ini hanya masalah yang muncul coba perbarui ke PHP 5. Ini menangani beberapa masalah ini. Mungkin terlihat seperti solusi konyol tetapi melakukan trik untuk saya.
sumber
Kasus luar biasa untuk pemberitahuan ini terjadi jika Anda mengatur array ke null di dalam foreach loop
sumber
Bagaimana dengan solusi ini:
sumber
Argumen tidak valid peringatan disediakan untuk
foreach()
tweet tampilan. pergi ke/wp-content/plugins/display-tweets-php
. Kemudian masukkan kode ini pada nomor baris 591, Ini akan berjalan dengan sempurna.sumber
if (is_array($_POST['auto'])){ // code }
Tampaknya ada juga hubungan dengan lingkungan:
Saya memiliki "argumen tidak valid disediakan foreach ()" kesalahan hanya di lingkungan dev, tetapi tidak di prod (saya bekerja di server, bukan localhost).
Meskipun ada kesalahan, var_dump menunjukkan bahwa array ada di sana (baik aplikasi maupun dev).
Di
if (is_array($array))
sekitarforeach ($array as $subarray)
memecahkan masalah.Maaf, saya tidak bisa menjelaskan penyebabnya, tetapi karena butuh beberapa saat untuk mencari solusi, saya pikir lebih baik membagikan ini sebagai pengamatan.
sumber
Gunakan fungsi is_array, ketika Anda akan meneruskan array ke foreach loop.
sumber
Bagaimana dengan mendefinisikan array kosong sebagai fallback jika
get_value()
kosong?Saya tidak bisa memikirkan cara terpendek.
sumber
Saya akan menggunakan kombinasi
empty
,isset
danis_array
sebagaisumber
saya akan melakukan hal yang sama seperti Andy tetapi saya akan menggunakan fungsi 'kosong'.
seperti itu:
sumber
$yourArray = 1;
itu akan mencoba untuk beralih, dan Anda akan mendapatkan kesalahan.empty()
bukan tes yang cocok.