Bagaimana menemukan apakah suatu objek kosong atau tidak di PHP.
Berikut ini adalah kode yang $obj
menyimpan data XML. Bagaimana cara memeriksa apakah kosong atau tidak?
Kode saya:
$obj = simplexml_load_file($url);
Bagaimana menemukan apakah suatu objek kosong atau tidak di PHP.
Berikut ini adalah kode yang $obj
menyimpan data XML. Bagaimana cara memeriksa apakah kosong atau tidak?
Kode saya:
$obj = simplexml_load_file($url);
Anda dapat mentransmisikan ke sebuah array dan kemudian memeriksa apakah itu kosong atau tidak
$arr = (array)$obj;
if (!$arr) {
// do stuff
}
empty($var)
setara dengan (!isset($var) || !$var)
. Anda dapat mengganti empty($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 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.
Sunting : Saya tidak menyadari mereka ingin secara khusus memeriksa apakah objek SimpleXMLElement kosong. Saya meninggalkan jawaban lama di bawah
Untuk SimpleXMLElement:
Jika dengan kosong yang Anda maksud tidak memiliki properti:
$obj = simplexml_load_file($url);
if ( !$obj->count() )
{
// no properties
}
ATAU
$obj = simplexml_load_file($url);
if ( !(array)$obj )
{
// empty array
}
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
}
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 empty
if ( $obj == new stdClass() )
{
echo "Object is empty"; // JSON: {}
}
else
{
echo "Object has properties";
}
Sumber: http://php.net/manual/en/language.oop5.object-comparison.php
Edit : contoh yang ditambahkan
$one = new stdClass();
$two = (object)array();
var_dump($one == new stdClass()); // TRUE
var_dump($two == new stdClass()); // TRUE
var_dump($one == $two); // TRUE
$two->test = TRUE;
var_dump($two == new stdClass()); // FALSE
var_dump($one == $two); // FALSE
$two->test = FALSE;
var_dump($one == $two); // FALSE
$two->test = NULL;
var_dump($one == $two); // FALSE
$two->test = TRUE;
$one->test = TRUE;
var_dump($one == $two); // TRUE
unset($one->test, $two->test);
var_dump($one == $two); // TRUE
PHP Warning: Uncaught Error: Call to undefined method stdClass::count()
->count()
khusus untuk contoh SimpleXMLElement
dan bukan untuk contoh stdClass
. Saya yakin semua ini masih berfungsi di PHP7.2.
Anda dapat memasukkan objek Anda ke dalam array, dan menguji jumlahnya seperti ini:
if(count((array)$obj)) {
// doStuff
}
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 foreach
loop dan false
segera 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 ).
Atau dengan menggunakan get_object_vars()
, mis
get_object_vars($obj) ? TRUE : FALSE;
Solusi lain yang memungkinkan yang tidak perlu ditransmisikan ke array
:
// test setup
class X { private $p = 1; } // private fields only => empty
$obj = new X;
// $obj->x = 1;
// test wrapped into a function
function object_empty( $obj ){
foreach( $obj as $x ) return false;
return true;
}
// inline test
$object_empty = true;
foreach( $obj as $object_empty ){ // value ignored ...
$object_empty = false; // ... because we set it false
break;
}
// 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 ();
http://it.php.net/manual/en/simplexmlelement.count.php
(itu bukan hitungan php http://www.php.net/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!";
}
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.
class Test { }
$t = new Test();
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.
$array = array_filter($array);
if(!empty($array)) {
echo "not empty";
}
atau
if(count($array) > 0) {
echo 'Error';
} else {
echo 'No Error';
}
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
}