Làm thế nào để kiểm tra một đối tượng trống trong PHP?


104

Cách tìm một đối tượng trống hay không trong PHP.

Sau đây là đoạn mã $objchứa dữ liệu XML. Làm thế nào tôi có thể kiểm tra xem nó có trống hay không?

Mã của tôi:

$obj = simplexml_load_file($url);


Câu trả lời:


130

Bạn có thể truyền sang một mảng và sau đó kiểm tra xem nó có trống hay không

$arr = (array)$obj;
if (!$arr) {
    // do stuff
}

9
Việc đánh máy không hoạt động đối với tôi, vì tôi gặp lỗi: Lỗi phân tích cú pháp PHP : lỗi cú pháp, không mong đợi '(mảng)' (mảng) (T_ARRAY_CAST) trong ... Tôi sử dụng phiên bản PHP 5.4.28 và tùy chọn đầu tiên với hai dòng mã phù hợp với tôi.
Coanda

Gặp lỗi tương tự khi tải lên plugin WordPress, có vẻ như họ cũng sử dụng phiên bản PHP cũ hơn.
Asaf

4
rỗng không thực sự kiểm tra xem một mảng có trống không, empty($var)tương đương với (!isset($var) || !$var). Bạn có thể thay thế của bạn empty($arr)s với !$arrtừarray() == FALSE
Timothy Zorn

2
Lý do empty((array) $obj)không hoạt động trong PHP 5.4+ không liên quan gì đến việc đánh máy trên một dòng. Bạn gặp lỗi vì empty()nhận tham chiếu đến các biến được truyền cho nó và nó không thể nhận tham chiếu khi đánh máy trừ khi bạn lưu trữ biến đã đánh máy đó trước trong một biến khác. Nó làm được điều này vì những gì tôi đã mô tả trong nhận xét trước đây của mình. Thật khó chịu khi đây là câu trả lời được chấp nhận vì nó có thể khiến mọi người tin rằng việc empty()kiểm tra xem một mảng có "rỗng" hay không - đó chỉ là tác dụng phụ của những gì nó thực sự làm.
Timothy Zorn

Nó sẽ hoạt động trong php 7+, Hay đó là cách phù hợp để sửa chữa nó.
kantsverma

32

Biên tập : Tôi không nhận ra rằng họ muốn kiểm tra cụ thể xem đối tượng SimpleXMLElement có trống không. Tôi để lại câu trả lời cũ bên dưới

Câu trả lời đã cập nhật (SimpleXMLElement) :

Đối với SimpleXMLElement:

Nếu không có nghĩa là bạn không có thuộc tính:

$obj = simplexml_load_file($url);
if ( !$obj->count() )
{
    // no properties
}

HOẶC LÀ

$obj = simplexml_load_file($url);
if ( !(array)$obj )
{
    // empty array
}

Nếu SimpleXMLElement sâu một cấp và bạn thực sự để trống nghĩa là nó chỉ có các thuộc tính mà PHP coi là falsey (hoặc không có thuộc tính):

$obj = simplexml_load_file($url);
if ( !array_filter((array)$obj) )
{
    // all properties falsey or no properties at all
}

Nếu SimpleXMLElement sâu hơn một cấp, bạn có thể bắt đầu bằng cách chuyển đổi nó thành một mảng thuần túy:

$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
}


Câu trả lời cũ (đối tượng đơn giản) :

Nếu bạn muốn kiểm tra xem một đối tượng đơn giản (loại stdClass) có hoàn toàn trống (không có khóa / giá trị) hay không, bạn có thể làm như sau:

// $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";
}

Nguồn: http://php.net/manual/en/language.oop5.object-comparison.php

Chỉnh sửa : thêm ví dụ

$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

Không hoạt động trong PHP7.2:PHP Warning: Uncaught Error: Call to undefined method stdClass::count()
Juha Untinen

2
@ juha-unainen Giải pháp với ->count()dành riêng cho các trường hợp SimpleXMLElementvà không dành cho các trường hợp stdClass. Tôi tin rằng tất cả những điều này vẫn hoạt động trong PHP7.2.
Timothy Zorn

21

Bạn có thể truyền đối tượng của mình vào một mảng và kiểm tra số lượng của nó như sau:

if(count((array)$obj)) {
   // doStuff
}

12

Hãy tưởng tượng nếu đối tượng không trống và có kích thước khá lớn, tại sao bạn lại lãng phí tài nguyên để ép nó thành mảng hoặc tuần tự hóa nó ...

Đây là một giải pháp rất dễ sử dụng trong JavaScript. Không giống như giải pháp đã đề cập là truyền một đối tượng sang mảng và kiểm tra xem nó có trống không hoặc để mã hóa nó thành JSON, hàm đơn giản này rất hiệu quả liên quan đến các tài nguyên đã sử dụng để thực hiện một tác vụ đơn giản.

function emptyObj( $obj ) {
    foreach ( $obj AS $prop ) {
        return FALSE;
    }

    return TRUE;
}

Giải pháp hoạt động theo cách rất đơn giản: Nó sẽ không nhập một vòng lặp foreach nào nếu đối tượng trống và nó sẽ quay trở lại true. Nếu nó không trống, nó sẽ đi vào foreachvòng lặp và trở lại falsengay lập tức, không chuyển qua toàn bộ tập hợp.


8

Việc sử dụng empty()sẽ không hoạt động như bình thường khi sử dụng nó trên một đối tượng, vì __isset()phương thức nạp chồng sẽ được gọi thay thế, nếu được khai báo.

Do đó bạn có thể sử dụng count()(nếu đối tượng là Countable ).

Hoặc bằng cách sử dụng get_object_vars(), ví dụ:

get_object_vars($obj) ? TRUE : FALSE;

7

Một giải pháp khả thi khác không cần truyền tới 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 ) );

2

không có cách an toàn duy nhất để kiểm tra xem một đối tượng có trống không

count () của php lần đầu tiên được truyền vào mảng, nhưng việc ép kiểu có thể tạo ra một mảng trống, phụ thuộc vào cách đối tượng được triển khai (các đối tượng của phần mở rộng thường bị ảnh hưởng bởi những vấn đề đó)

trong trường hợp của bạn, bạn phải sử dụng $ obj-> count ();

http://it.php.net/manual/en/simplexmlelement.count.php

(đó không phải là số lượng php http://www.php.net/count )


1

Nếu bạn ép bất cứ thứ gì trong PHP dưới dạng (bool), nó sẽ cho bạn biết ngay mục đó là đối tượng, kiểu nguyên thủy hay null. Sử dụng mã sau:

$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!";
}

1
Sai lầm. $ x = new \ stdClass (); var_dump ((bool) $ x); in 'true'; Trong trường hợp của bạn, SimpleXML có thể trở lại sai trong một số trường hợp
Quamis

Chính xác. new stdClass () là một đối tượng hợp lệ, đó là lý do tại sao nó đúng. Hướng dẫn sử dụng PHP cho biết, simplexml_load_file (), "Trả về một đối tượng của lớp SimpleXMLElement với các thuộc tính chứa dữ liệu được giữ trong tài liệu XML, hoặc FALSE khi bị lỗi." Vì vậy, nếu bạn ép kiểu (bool) simplexml_load_file (), nó sẽ là true (vì hàm trả về một đối tượng) nhưng false (vì hàm trả về false).
roosevelt

0

Nếu một đối tượng là "rỗng" hay không là vấn đề của định nghĩa, và vì nó phụ thuộc vào bản chất của đối tượng mà lớp đại diện, nên lớp đó sẽ xác định.

Bản thân PHP coi mọi trường hợp của một lớp là không rỗng.

class Test { }
$t = new Test();
var_dump(empty($t));

// results in bool(false)

Không thể có một định nghĩa chung cho một đối tượng "rỗng". Bạn có thể tranh luận trong ví dụ trên, kết quả của empty()nên là true, bởi vì đối tượng không đại diện cho bất kỳ nội dung nào. Nhưng làm thế nào để biết PHP? Một số đối tượng không bao giờ được dùng để đại diện cho nội dung (ví dụ như nhà máy), những đối tượng khác luôn đại diện cho một giá trị có ý nghĩa (suy nghĩ new DateTime()).

Tóm lại, bạn sẽ phải đưa ra các tiêu chí của riêng mình cho một đối tượng cụ thể và kiểm tra chúng cho phù hợp, từ bên ngoài đối tượng hoặc từ một isEmpty()phương pháp tự viết trong đối tượng.


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

hoặc là

if(count($array) > 0) {
    echo 'Error';
} else {
    echo 'No Error';
}

Mặc dù điều này có thể trả lời câu hỏi nhưng luôn luôn là một ý kiến ​​hay nếu bạn đưa một số văn bản vào câu trả lời để giải thích những gì bạn đang làm. Đọc cách viết một câu trả lời hay .
Jørgen R

-1

Tôi đang sử dụng json_decode của một chuỗi trong yêu cầu bài đăng. Không có cái nào ở trên phù hợp với tôi, cuối cùng tôi đã sử dụng cái này:

$post_vals = json_decode($_POST['stuff']);

if(json_encode($post_vals->object) != '{}')
{
    // its not empty
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.