Как найти, является ли объект пустым или нет в PHP.
Ниже приведен код, в котором $obj
хранит данные XML. Как я могу проверить, пуст ли он или нет?
Мой код:
$obj = simplexml_load_file($url);
Как найти, является ли объект пустым или нет в PHP.
Ниже приведен код, в котором $obj
хранит данные XML. Как я могу проверить, пуст ли он или нет?
Мой код:
$obj = simplexml_load_file($url);
Вы можете использовать массив, а затем проверить, пуст он или нет.
$arr = (array)$obj;
if (empty($arr)) {
// do stuff
}
Изменить: однострочное typecasting, как показано ниже, не работает в 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 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()
, если он объявлен.
Поэтому вы можете использовать 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 count 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
}