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

oaxa6hgo  于 2022-12-25  发布在  PHP
关注(0)|答案(6)|浏览(124)

我有一个模型可以检查数据库中的条目,就像这样:

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 ( )
smtd7mpg

smtd7mpg1#

你为什么不能用

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

这样您就可以对两个实体执行检查。
因为图像是一个可以迭代的对象,你也可以检查它。

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

另外,您似乎对布尔值使用了错误的比较运算符,您应该使用严格的比较标准,即===,而不是==,或者!==,而不是!=:)

oprakyz7

oprakyz72#

我知道这是一个老问题,但它仍然没有得到正确的回答。
isset * 仅 * 测试键是否存在 * 而 * 不测试键是否为空。这是一个重要的区别。请参见示例:http://us1.php.net/isset
要正确测试数组是否包含键,应按照本页其他地方的说明使用array_key_exists
另一方面,若要测试对象是否包含属性,则应使用property_exists方法。即使属性具有NULL值,property_exists()也会返回TRUE
所以,你的代码应该看起来像这样(是的,我改变了一点,但重点仍然是一样的):

<?php
    if ( isset( $content ) && property_exists( $content, 'images' ) ) {
        echo '<pre>' . print_r( $content->images, true ) . '</pre>';
    }
?>
uinbv5nw

uinbv5nw3#

在尝试了解如何检查空stdClass时遇到此问题/答案。
给出的答案并不是真正的答案的问题在主题,导致人们在这里不会得到一个明确的答案,所以我会添加一个改进的版本:

    • 问题:**检查PHP中的stdClass对象是否有"条目"
    • 答案:**

将stdClass类型转换为array,如下所示:

$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
hfwmuf9z

hfwmuf9z4#

countisset一起使用:

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

codepad example

2uluyalo

2uluyalo5#

我想检查某个对象是否具有给定的所有属性,所以我做了以下操作:

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

zazmityj6#

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

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

相关问题