Typecasting tidak berfungsi untuk saya, karena saya mendapatkan kesalahan: PHP Parse error: sintaks error, tak terduga '(array)' (array) (T_ARRAY_CAST) di ... Saya menggunakan PHP versi 5.4.28 dan opsi pertama dengan dua baris kode bekerja untuk saya.
Coanda
Sempat mengalami error yang sama saat mengupload plugin WordPress, sepertinya mereka juga menggunakan PHP versi lawas.
Asaf
4
kosong tidak benar-benar memeriksa apakah sebuah array kosong, empty($var)setara dengan (!isset($var) || !$var). Anda dapat mengganti empty($arr)s Anda dengan !$arrsejakarray() == FALSE
Timothy Zorn
2
Alasan empty((array) $obj)tidak berfungsi di PHP 5.4+ tidak ada hubungannya dengan typecasting pada satu baris. Anda mendapatkan kesalahan karena empty()mengambil referensi ke variabel yang diteruskan ke sana, dan itu tidak bisa mendapatkan referensi saat typecasting kecuali Anda pertama kali menyimpan variabel typecasted itu di variabel lain. Ini dilakukan karena apa yang saya jelaskan dalam komentar saya sebelumnya. Agak frustasi bahwa ini adalah jawaban yang diterima karena dapat membuat orang percaya bahwa empty()memeriksa apakah sebuah array "kosong" yang tidak benar - itu hanya efek samping dari apa yang sebenarnya dilakukannya.
Timothy Zorn
Apakah ini akan berhasil di php 7+, Atau apakah itu cara yang tepat untuk memperbaikinya.
kantsverma
32
Sunting : Saya tidak menyadari mereka ingin secara khusus memeriksa apakah objek SimpleXMLElement kosong. Saya meninggalkan jawaban lama di bawah
Jawaban yang Diperbarui (SimpleXMLElement) :
Untuk SimpleXMLElement:
Jika dengan kosong yang Anda maksud tidak memiliki properti:
$obj = simplexml_load_file($url);if(!$obj->count()){// no properties}
Jika SimpleXMLElement sedalam satu tingkat, dan dengan kosong maksud Anda sebenarnya ia hanya memiliki properti yang dianggap PHP sebagai falsey (atau tidak ada properti):
$obj = simplexml_load_file($url);if(!array_filter((array)$obj)){// all properties falsey or no properties at all}
Jika SimpleXMLElement lebih dari satu level, Anda dapat mulai dengan mengubahnya menjadi array murni:
$obj = simplexml_load_file($url);// `json_decode(json_encode($obj), TRUE)` can be slow because// you're converting to and from a JSON string.// I don't know another simple way to do a deep conversion from object to array
$array = json_decode(json_encode($obj), TRUE);if(!array_filter($array)){// empty or all properties falsey}
Jawaban Lama (objek sederhana) :
Jika Anda ingin memeriksa apakah objek sederhana (tipe stdClass) benar-benar kosong (tidak ada kunci / nilai), Anda dapat melakukan hal berikut:
// $obj is type stdClass and we want to check if it's emptyif( $obj ==new stdClass()){
echo "Object is empty";// JSON: {}}else{
echo "Object has properties";}
Tidak bekerja di PHP7.2:PHP Warning: Uncaught Error: Call to undefined method stdClass::count()
Juha Untinen
2
@ juha-untinen Solusi dengan ->count()khusus untuk contoh SimpleXMLElementdan bukan untuk contoh stdClass. Saya yakin semua ini masih berfungsi di PHP7.2.
Timothy Zorn
21
Anda dapat memasukkan objek Anda ke dalam array, dan menguji jumlahnya seperti ini:
Bayangkan jika objek tidak kosong dan dengan cara yang cukup besar, mengapa Anda menyia-nyiakan sumber daya untuk melemparkannya ke array atau membuat serialnya ...
Ini adalah solusi yang sangat mudah yang saya gunakan dalam JavaScript. Tidak seperti solusi yang disebutkan yang mentransmisikan objek ke array dan memeriksa apakah itu kosong, atau untuk menyandikannya ke JSON, fungsi sederhana ini sangat efisien terkait sumber daya yang digunakan untuk melakukan tugas sederhana.
function emptyObj( $obj ){foreach( $obj AS $prop ){return FALSE;}return TRUE;}
Solusinya bekerja dengan cara yang sangat sederhana: Ini tidak akan memasuki loop foreach sama sekali jika objek kosong dan akan kembali true. Jika tidak kosong, itu akan memasuki foreachloop dan falsesegera kembali , tidak melewati seluruh set.
Penggunaan empty()tidak akan berfungsi seperti biasa saat menggunakannya pada objek, karena __isset()metode overloading akan dipanggil sebagai gantinya, jika dideklarasikan.
Oleh karena itu Anda dapat menggunakan count()(jika objeknya Dapat Dihitung ).
Solusi lain yang memungkinkan yang tidak perlu ditransmisikan ke array:
// test setupclass X {private $p =1;}// private fields only => empty
$obj =new X;// $obj->x = 1;// test wrapped into a functionfunction object_empty( $obj ){foreach( $obj as $x )returnfalse;returntrue;}// inline test
$object_empty =true;foreach( $obj as $object_empty ){// value ignored ...
$object_empty =false;// ... because we set it falsebreak;}// test
var_dump( $object_empty, object_empty( $obj ));
tidak ada cara aman yang unik untuk memeriksa apakah suatu objek kosong
php's count () pertama kali melakukan cast ke array, tetapi casting dapat menghasilkan array kosong, tergantung bagaimana objek diimplementasikan (objek ekstensi sering dipengaruhi oleh masalah tersebut)
dalam kasus Anda, Anda harus menggunakan $ obj-> count ();
Jika Anda mentransmisikan sesuatu di PHP sebagai (bool), ini akan langsung memberi tahu Anda jika item tersebut adalah objek, tipe primitif, atau null. Gunakan kode berikut:
$obj = simplexml_load_file($url);if(!(bool)$obj){print"This variable is null, 0 or empty";}else{print"Variable is an object or a primitive type!";}
salah. $ x = baru \ stdClass (); var_dump ((bool) $ x); mencetak 'benar'; Dalam kasus Anda, simpleXml mungkin menampilkan false dalam beberapa kasus
Quamis
Benar. new stdClass () adalah objek yang valid, itulah mengapa itu benar. Manual PHP mengatakan, simplexml_load_file (), "Mengembalikan objek kelas SimpleXMLElement dengan properti yang berisi data yang disimpan dalam dokumen XML, atau FALSE jika gagal." Jadi, jika Anda mentransmisikan (bool) simplexml_load_file (), itu akan menjadi benar (karena fungsi mengembalikan objek) tetapi salah (karena fungsi mengembalikan salah).
roosevelt
0
Jika sebuah objek "kosong" atau tidak adalah masalah definisi, dan karena itu bergantung pada sifat objek yang diwakili oleh kelas, itu adalah untuk kelas yang mendefinisikan.
PHP sendiri menganggap setiap instance kelas tidak kosong.
classTest{}
$t =newTest();
var_dump(empty($t));// results in bool(false)
Tidak ada definisi umum untuk objek "kosong". Anda mungkin membantah dalam contoh di atas hasil dari empty()should be true, karena objek tidak mewakili konten apapun. Tapi bagaimana PHP tahu? Beberapa objek tidak pernah dimaksudkan untuk mewakili konten (pikirkan pabrik misalnya), yang lain selalu mewakili nilai yang berarti (berpikir new DateTime()).
Singkatnya, Anda harus membuat kriteria Anda sendiri untuk objek tertentu, dan mengujinya sesuai, baik dari luar objek atau dari isEmpty()metode yang ditulis sendiri di objek.
Meskipun ini mungkin menjawab pertanyaan, selalu merupakan ide yang baik untuk memasukkan beberapa teks dalam jawaban Anda untuk menjelaskan apa yang Anda lakukan. Bacalah cara menulis jawaban yang bagus .
Jørgen R
-1
Saya menggunakan json_decode dari string dalam permintaan posting. Tak satu pun di atas berhasil untuk saya, pada akhirnya saya menggunakan ini:
$post_vals = json_decode($_POST['stuff']);if(json_encode($post_vals->object)!='{}'){// its not empty}
Jawaban:
Anda dapat mentransmisikan ke sebuah array dan kemudian memeriksa apakah itu kosong atau tidak
sumber
empty($var)
setara dengan(!isset($var) || !$var)
. Anda dapat menggantiempty($arr)
s Anda dengan!$arr
sejakarray() == FALSE
empty((array) $obj)
tidak berfungsi di PHP 5.4+ tidak ada hubungannya dengan typecasting pada satu baris. Anda mendapatkan kesalahan karenaempty()
mengambil referensi ke variabel yang diteruskan ke sana, dan itu tidak bisa mendapatkan referensi saat typecasting kecuali Anda pertama kali menyimpan variabel typecasted itu di variabel lain. Ini dilakukan karena apa yang saya jelaskan dalam komentar saya sebelumnya. Agak frustasi bahwa ini adalah jawaban yang diterima karena dapat membuat orang percaya bahwaempty()
memeriksa apakah sebuah array "kosong" yang tidak benar - itu hanya efek samping dari apa yang sebenarnya dilakukannya.Sunting : Saya tidak menyadari mereka ingin secara khusus memeriksa apakah objek SimpleXMLElement kosong. Saya meninggalkan jawaban lama di bawah
Jawaban yang Diperbarui (SimpleXMLElement) :
Untuk SimpleXMLElement:
Jika dengan kosong yang Anda maksud tidak memiliki properti:
ATAU
Jika SimpleXMLElement sedalam satu tingkat, dan dengan kosong maksud Anda sebenarnya ia hanya memiliki properti yang dianggap PHP sebagai falsey (atau tidak ada properti):
Jika SimpleXMLElement lebih dari satu level, Anda dapat mulai dengan mengubahnya menjadi array murni:
Jawaban Lama (objek sederhana) :
Jika Anda ingin memeriksa apakah objek sederhana (tipe
stdClass
) benar-benar kosong (tidak ada kunci / nilai), Anda dapat melakukan hal berikut:Sumber: http://php.net/manual/en/language.oop5.object-comparison.php
Edit : contoh yang ditambahkan
sumber
PHP Warning: Uncaught Error: Call to undefined method stdClass::count()
->count()
khusus untuk contohSimpleXMLElement
dan bukan untuk contohstdClass
. Saya yakin semua ini masih berfungsi di PHP7.2.Anda dapat memasukkan objek Anda ke dalam array, dan menguji jumlahnya seperti ini:
sumber
Bayangkan jika objek tidak kosong dan dengan cara yang cukup besar, mengapa Anda menyia-nyiakan sumber daya untuk melemparkannya ke array atau membuat serialnya ...
Ini adalah solusi yang sangat mudah yang saya gunakan dalam JavaScript. Tidak seperti solusi yang disebutkan yang mentransmisikan objek ke array dan memeriksa apakah itu kosong, atau untuk menyandikannya ke JSON, fungsi sederhana ini sangat efisien terkait sumber daya yang digunakan untuk melakukan tugas sederhana.
Solusinya bekerja dengan cara yang sangat sederhana: Ini tidak akan memasuki loop foreach sama sekali jika objek kosong dan akan kembali
true
. Jika tidak kosong, itu akan memasukiforeach
loop danfalse
segera kembali , tidak melewati seluruh set.sumber
Penggunaan
empty()
tidak akan berfungsi seperti biasa saat menggunakannya pada objek, karena__isset()
metode overloading akan dipanggil sebagai gantinya, jika dideklarasikan.Oleh karena itu Anda dapat menggunakan
count()
(jika objeknya Dapat Dihitung ).Atau dengan menggunakan
get_object_vars()
, missumber
Solusi lain yang memungkinkan yang tidak perlu ditransmisikan ke
array
:sumber
tidak ada cara aman yang unik untuk memeriksa apakah suatu objek kosong
php's count () pertama kali melakukan cast ke array, tetapi casting dapat menghasilkan array kosong, tergantung bagaimana objek diimplementasikan (objek ekstensi sering dipengaruhi oleh masalah tersebut)
dalam kasus Anda, Anda harus menggunakan $ obj-> count ();
http://it.php.net/manual/en/simplexmlelement.count.php
(itu bukan hitungan php http://www.php.net/count )
sumber
Jika Anda mentransmisikan sesuatu di PHP sebagai (bool), ini akan langsung memberi tahu Anda jika item tersebut adalah objek, tipe primitif, atau null. Gunakan kode berikut:
sumber
Jika sebuah objek "kosong" atau tidak adalah masalah definisi, dan karena itu bergantung pada sifat objek yang diwakili oleh kelas, itu adalah untuk kelas yang mendefinisikan.
PHP sendiri menganggap setiap instance kelas tidak kosong.
Tidak ada definisi umum untuk objek "kosong". Anda mungkin membantah dalam contoh di atas hasil dari
empty()
should betrue
, karena objek tidak mewakili konten apapun. Tapi bagaimana PHP tahu? Beberapa objek tidak pernah dimaksudkan untuk mewakili konten (pikirkan pabrik misalnya), yang lain selalu mewakili nilai yang berarti (berpikirnew DateTime()
).Singkatnya, Anda harus membuat kriteria Anda sendiri untuk objek tertentu, dan mengujinya sesuai, baik dari luar objek atau dari
isEmpty()
metode yang ditulis sendiri di objek.sumber
atau
sumber
Saya menggunakan json_decode dari string dalam permintaan posting. Tak satu pun di atas berhasil untuk saya, pada akhirnya saya menggunakan ini:
sumber