Как найти, является ли объект пустым или нет в PHP.
Ниже приведен код, в котором $obj
содержит данные XML. Как я могу проверить, пуст он или нет?
Мой код:
$obj = simplexml_load_file($url);
Вы можете использовать массив, а затем проверить, является ли он пустым или нет.
$arr = (array)$obj; if (empty($arr)) { // do stuff }
Изменить: однострочное типизирование, как показано ниже, не работает в PHP 5.4:
if (empty((array) $obj)) { //do stuff }
Изменить : я не понимал, что они хотят конкретно проверить, не является ли объект SimpleXMLElement пустым. Я оставил старый ответ ниже
Для SimpleXMLElement:
Если по пустому вы имеете в виду не имеет свойств:
$obj = simplexml_load_file($url); if ( !$obj->count() ) { // no properties }
ИЛИ
$obj = simplexml_load_file($url); if ( !(array)$obj ) { // empty array }
Если SimpleXMLElement имеет один уровень глубины и пустым, вы на самом деле означаете, что он имеет только свойства, которые PHP считает ложными (или без свойств):
$obj = simplexml_load_file($url); if ( !array_filter((array)$obj) ) { // all properties falsey or no properties at all }
Если SimpleXMLElement имеет более одного уровня, вы можете начать с преобразования его в чистый массив:
$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 }
Если вы хотите проверить, является ли простой объект (тип stdClass
) полностью пустым (нет ключей / значений), вы можете сделать следующее:
// $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"; }
Источник: http://php.net/manual/en/language.oop5.object-comparison.php
Изменить : добавлен пример
$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
Еще одно возможное решение, которое не требует литья в 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 ) );
Вы можете передать свой объект в массив и проверить его так:
if(count((array)$obj)) { // doStuff }
Использование empty()
не будет работать, как обычно, при использовании его на объекте, потому что __isset()
будет вызываться метод перегрузки __isset()
, если он объявлен.
Поэтому вы можете использовать count()
(если объект является Countable ).
Или используя get_object_vars()
, например
get_object_vars($obj) ? TRUE : FALSE;
Это очень простое решение, которое я использую в JavaScript. В отличие от упомянутого решения, которое бросает объект в массив и проверяет, является ли оно пустым, или для его кодирования в JSON, эта простая функция очень эффективна в отношении используемых ресурсов для выполнения простой задачи.
function emptyObj($obj) { foreach ($obj as $k) { return false; } return true; }
Решение работает очень просто: он вообще не будет вводить петлю foreach, если объект пуст, и он вернет true. Если он не пуст, он войдет в цикл foreach и сразу вернет false, а не через весь набор.
Уже есть правильный ответ, но я отправляю его снова. Я понимаю, что PHP – это грязный язык, но cmon guys … Представьте себе, если объект не пуст и в каком-то смысле довольно большой, зачем вам тратить ресурсы, чтобы отбросить его на массив или сериализовать его …
нет единственного безопасного способа проверить, нет ли объекта
php count () сначала приводит к массиву, но литье может создавать пустой массив, зависит от того, как реализуется объект (объекты объектов расширения часто затрагиваются этими проблемами)
в вашем случае вам нужно использовать $ obj-> count ();
http://it.php.net/manual/en/simplexmlelement.count.php
(это не счет php http://www.php.net/count )
Если вы нарисуете что-нибудь в PHP как (bool), он сразу скажет вам, является ли объект объектом, примитивным типом или нулем. Используйте следующий код:
$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!"; }
Если объект «пуст» или нет, это вопрос определения, и поскольку он зависит от характера объекта, который представляет класс, он должен определить класс.
Сам PHP рассматривает каждый экземпляр класса как не пустой.
class Test { } $t = new Test(); var_dump(empty($t)); // results in bool(false)
Не может быть общего определения для «пустого» объекта. Вы можете утверждать, что в приведенном выше примере результат empty()
должен быть true
, потому что объект не представляет никакого содержимого. Но как PHP знать? Некоторые объекты никогда не предназначены для представления контента (например, на заводе-изготовителе), другие всегда представляют значимое значение (думаю, new DateTime()
).
Короче говоря, вам придется придумать свои собственные критерии для конкретного объекта и проверить их соответственно, либо вне объекта, либо из самописного метода isEmpty()
в объекте.
$array = array_filter($array); if(!empty($array)) { echo "not empty"; }
или
if(count($array) > 0) { echo 'Error'; } else { echo 'No Error'; }
Я использовал json_decode строки в почтовом запросе. Ни один из вышеперечисленных не работал для меня, в конце я использовал это:
$post_vals = json_decode($_POST['stuff']); if(json_encode($post_vals->object) != '{}') { // its not empty }