Подтвердить что ты не робот

Проверьте, имеет ли объект 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 ( )
4b9b3361

Ответ 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
}