检查stdClass对象是否在PHP中有“条目”

时间:2010-12-24 19:13:05

标签: 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 ...我不知道如何跳过“严重性:通知消息:未定义的变量”。

提前谢谢。

更新:

$content的图片数量多于图片集,例如$content->_data$content->title

当我在数据库上没有图像并且我没有从MySQL返回时,执行此操作:

<?php echo count($content->images); ?>
<pre><?php print_r($content->images); ?></pre>

输出结果为:

1
stdClass ( )

6 个答案:

答案 0 :(得分:65)

为什么你不能使用

if(isset($content->images)) //Isset also will make sure $content is set
{

}

这样就可以对两个实体进行检查。

由于图像是一个可以迭代的对象,你也可以检查它。

if(isset($content->images) && is_object($content->images))
{

}

你似乎也使用错误的比较运算符作为布尔值,你应该使用严格的比较标准,===而不是==,或!==而不是{ {1}}:)

圣诞快乐

答案 1 :(得分:14)

我知道这是一个老问题,但仍未得到妥善回答。

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>';
    }
?>

答案 2 :(得分:6)

在试图找出如何检查空stdClass时,请进入此问题/答案。

给出的答案并不是主题中问题的真正答案,导致这里的人不会得到明确的答案,所以我将添加一个改进的版本:

<强>问题: 检查stdClass对象是否在PHP中有“条目”

<强>答案:

将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

答案 3 :(得分:3)

count使用isset

if(isset($content) && count($content)) {
  //$content has properties...
  if(isset($content->images)) { //$content->images exists
    //awesome stuff goes here...
  }  
}

codepad example

答案 4 :(得分:1)

我想检查某个对象是否具有所有的给定属性。所以我这样做了:

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";

答案 5 :(得分:0)

如果我想测试整个对象,知道我是否做了某些事情,我会这样做:

if($object != new stdClass())
{
    // do something
}