【问题标题】:Foreach Object with one element PHP具有一个元素 PHP 的 Foreach 对象
【发布时间】:2014-06-26 09:44:14
【问题描述】:

我有一个名为$people 的对象。它由我的数据库填充。这个对象看起来像这样:

Array
(
[0] => stdClass Object
    (
        [id] => 21
        [fname] => Billy
        [lname] => Boemba
        [email] => email@example.com
        [country] => The Netherlands
    )

[1] => stdClass Object
    (
        [id] => 22
        [fname] => Jill
        [lname] => Jimba
        [email] => email@example.com
        [country] => Austria
    )

我的 foreach 是这样的:

foreach($people as $person){
    // echo some stuff about the person
}

所有这些都有效,但是当我的数据库中有一条记录时,$people 只有一个元素,当我尝试使用 foreach() 时出现错误:
Notice: Trying to get property of non-object

那么如何在对象中使用foreach() 函数和一个元素?

【问题讨论】:

  • $people 在哪里初始化?
  • 在 foreach 之前检查 is_array($people)
  • 创建$people的函数应该一直把它变成一个数组,而不是只有一个人的时候一个对象,这样你就不用一直检查这个了。
  • 不,首先为您看到错误的情况执行var_dump($people)(在 foreach 调用之前)
  • 在这段代码之前,我知道它可以工作,但是当我删除数据库中的记录,所以只剩下一条记录时,php 给出了我所说的错误

标签: php object foreach


【解决方案1】:

因为$people 是一个对象而不是数组。使用 var_dump($people),你会发现 $people 是一个对象。如果 $people 包含多个对象,使用 var_dump($people) 会发现 $people 是一个数组。

函数 foreach 仅适用于数组对象。所以事情出了问题。

is_array($people) 将是一个很好的解决方案。

【讨论】:

    【解决方案2】:

    当我没有进行正确的错误检查并且我将布尔值传递到 foreach 循环中时,我得到了同样的错误:

    if (!$sth = $this->database->query($query)) {
        print_r($this->database->errorInfo());
    }
    
    if(!$record = $sth->fetch(PDO::FETCH_ASSOC)){
        die('record not found');
    }else{
        return $record;
    }
    

    【讨论】:

    • 但是我在获取对象时没有出错,但是当我尝试 foreach 时却出错了
    • 获取函数将运行。如果它未能返回记录,它只会返回 FALSE。 “此函数成功时的返回值取决于获取类型。在所有情况下,失败时返回 FALSE。” -php.net/manual/en/pdostatement.fetch.php
    【解决方案3】:

    Foreach 可以在一个元素数组上运行。我想当只有一个元素时,你的脚本的某些部分简单不会返回数组,这就是你对 foreach 有问题的原因

    【讨论】:

    • Foreach 也可以在对象上运行,实际上是 any 对象。只是$people既不是数组也不是对象。
    • @hakre 只有Iterable 对象确定吗?
    猜你喜欢
    • 1970-01-01
    • 2017-06-09
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 2018-03-18
    • 2017-09-12
    相关资源
    最近更新 更多