Проверьте, имеет ли объект stdClass "записи" в PHP
У меня есть модель, которая проверяет записи в базе данных. Вот так:
public function getByID($id)
{
if(false == is_numeric($id))
return false;
$images = array();
$query = $this->db->where("id_album", $id)->order_by("order", "ASC")->get("images");
foreach($query->result() as $row)
$images[] = $row;
return (object) $images;
}
На мой взгляд, я хочу знать, есть ли у меня строки или нет, чтобы показать изображения или нет. Я делаю это:
<?php if(false != isset($content->images)): ?>
<pre><?php print_r($content->images); ?></pre>
<?php endif; ?>
Но каждый раз, когда я пытаюсь пропустить, когда у меня нет результатов (я получаю stdClass() пуст), я терплю неудачу. Я пробовал isset
, $content->images != NULL
, !$content->images
... Я не знаю, как это сделать, чтобы пропустить "Severity: Notice Message: Undefined variable".
Спасибо заранее.
UPDATE:
$content
имеет больше наборов, чем изображения, например $content->_data
или $content->title
.
Когда у меня нет изображений в базе данных, и у меня нет возврата из MySQL, сделайте следующее:
<?php echo count($content->images); ?>
<pre><?php print_r($content->images); ?></pre>
Вывод:
1
stdClass ( )
Ответы
Ответ 1
почему вы не можете использовать
if(isset($content->images)) //Isset also will make sure $content is set
{
}
Таким образом, вы выполняете проверки для обоих объектов.
Поскольку изображения - это объект, который можно повторить, вы также можете проверить это.
if(isset($content->images) && is_object($content->images))
{
}
Также вы, кажется, используете неправильные операторы сравнения для boolean's, вы должны использовать строгие стандарты для сравнения, то есть ===
, а не ==
, или !==
, а не !=
:)
С Рождеством Христовым
Ответ 2
Я знаю, что это старый вопрос, но на него все еще не ответил должным образом.
isset
проверяет только наличие ключа, а не null. Это любое важное различие. См. Примеры: http://us1.php.net/isset
Чтобы правильно проверить, содержит ли массив ключ, array_key_exists
следует использовать, как указано в другом месте на этой странице.
С другой стороны, чтобы проверить, содержит ли объект свойство, следует использовать метод property_exists
. property_exists()
возвращает TRUE
, даже если свойство имеет значение NULL
.
Итак, ваш код должен выглядеть так (да, я немного изменил его, но точка осталась прежней):
<?php
if ( isset( $content ) && property_exists( $content, 'images' ) ) {
echo '<pre>' . print_r( $content->images, true ) . '</pre>';
}
?>
Ответ 3
Перейдите в этот вопрос/ответы, пытаясь выяснить, как проверить пустой stdClass.
Данные ответы на самом деле не отвечают на вопрос в теме, приводя сюда людей, которые не получат ясный ответ, поэтому я добавлю улучшенную версию:
Вопрос:
Проверьте, имеет ли объект stdClass "записи" в PHP
Ответ:
Typecast stdClass для массива, см. ниже:
$someObject = new StdClass();
var_dump(empty($someObject)); // Will return false, because $someObject is an stdClass
// Convert to array
$someObjectArr = (array)$someObject;
var_dump(empty($someObjectArray)); // Will return true
Ответ 4
Используйте count
с isset
:
if(isset($content) && count($content)) {
//$content has properties...
if(isset($content->images)) { //$content->images exists
//awesome stuff goes here...
}
}
пример кода
Ответ 5
Я хотел проверить, имеет ли какой-либо объект все заданные свойства. Поэтому я сделал это:
function hasAllProperties($object, array $properties) {
return array_reduce(
$properties,
function ($acc, $property) use ($object) {
return $acc && property_exists($object, $property);
},
true
);
};
$someObject = json_decode('{"foo": "bar", "baz": "quux"}');
echo 'should be true ' . (hasAllProperties($someObject, ['foo', 'baz']) ? 'TRUE' : 'FALSE') . "\n";
echo 'should be false ' . (hasAllProperties($someObject, ['foo', 'baz', 'moo']) ? 'TRUE' : 'FALSE') . "\n";
echo 'should be false ' . (hasAllProperties($someObject, ['foo', 'moo']) ? 'TRUE' : 'FALSE') . "\n";
Затем вы также можете проверить, существует ли только одно или несколько свойств:
function hasAnyProperties($object, array $properties) {
return array_reduce(
$properties,
function ($acc, $property) use ($object) {
return $acc || property_exists($object, $property);
},
false
);
};
$someObject = json_decode('{"foo": "bar", "baz": "quux"}');
echo 'should be true ' . (hasAnyProperties($someObject, ['foo', 'baz']) ? 'TRUE' : 'FALSE') . "\n";
echo 'should be true ' . (hasAnyProperties($someObject, ['foo', 'baz', 'moo']) ? 'TRUE' : 'FALSE') . "\n";
echo 'should be true ' . (hasAnyProperties($someObject, ['foo', 'moo']) ? 'TRUE' : 'FALSE') . "\n";
echo 'should be false ' . (hasAnyProperties($someObject, ['moo']) ? 'TRUE' : 'FALSE') . "\n";
Ответ 6
Если я хочу протестировать весь объект, чтобы узнать, что я делаю что-то или нет, я делаю так:
if($object != new stdClass())
{
// do something
}