Bagaimana cara memeriksa bahwa suatu objek kosong di PHP?

Jawaban:

130

Anda dapat mentransmisikan ke sebuah array dan kemudian memeriksa apakah itu kosong atau tidak

$arr = (array)$obj;
if (!$arr) {
    // do stuff
}
Peter Kelly
sumber
9
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
}

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
}


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 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
Timothy Zorn
sumber
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:

if(count((array)$obj)) {
   // doStuff
}
Mohamed23gharbi
sumber
12

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.

stamat
sumber
8

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;
kenorb
sumber
7

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 ) );
biziclop
sumber
2

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
1

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!";
}
roosevelt
sumber
1
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.

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.

nem75
sumber
0
$array = array_filter($array);
if(!empty($array)) {
    echo "not empty";
}

atau

if(count($array) > 0) {
    echo 'Error';
} else {
    echo 'No Error';
}
Muhammad Tahir
sumber
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
}
Frank Conry
sumber