Cách tìm một đối tượng trống hay không trong PHP.
Sau đây là đoạn mã $obj
chứ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ách tìm một đối tượng trống hay không trong PHP.
Sau đây là đoạn mã $obj
chứ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:
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
}
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 !$arr
từarray() == FALSE
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.
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
Đố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
}
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
PHP Warning: Uncaught Error: Call to undefined method stdClass::count()
->count()
dành riêng cho các trường hợp SimpleXMLElement
và 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.
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
}
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 foreach
vòng lặp và trở lại false
ngay lập tức, không chuyển qua toàn bộ tập hợp.
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;
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 ) );
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 )
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!";
}
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.
$array = array_filter($array);
if(!empty($array)) {
echo "not empty";
}
hoặc là
if(count($array) > 0) {
echo 'Error';
} else {
echo 'No Error';
}
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
}