30

我试图复制这段代码:

<?php
foreach ($products as $product) {
    $id          = $product['id'];
    $name        = $product['name'];
    $description = $product['description'];
    $price       = $product['price'];
?>
    <tr>
    <td><img src="<?php echo $product['picture']; ?>" /></td>
        <td><b><?php echo $name; ?></b><br />
        <?php echo $description; ?><br />
          Price:<big style="color:green">
          $<?php echo $price; ?></big><br /><br />
<?php
    echo form_open('cart/add');
    echo form_hidden('id', $id);
    echo form_hidden('name', $name);
    echo form_hidden('price', $price);
    echo form_submit('action', 'Add to Cart');
    echo form_close();
?>
    </td>
    </tr>
    <tr><td colspan="2"><hr size="1" /></td>
<?php
}
?>

这是我的代码:

<?php
   foreach ($blogs as $blog) {
      $id      = $blog['id'];
      $title   = $blog['title'];
      $content = $blog['content'];
?>
      <h1><?php echo $title; ?></h1>
      <h1> <?php echo $content; ?> </h1>

<?php
}
?>

每次运行代码时都会出现此错误:“不能将 stdClass 类型的对象用作数组”

4

6 回答 6

72

您从中复制的示例是使用包含数组的数组形式的数据,您正在使用包含对象的数组形式的数据。对象和数组并不相同,因此它们使用不同的语法来访问数据。

如果您不知道变量名称,只需var_dump($blog);在循环中执行 a 即可查看它们。

最简单的方法 - 直接访问 $blog 作为对象:

尝试(假设这些变量是正确的):

<?php 
    foreach ($blogs as $blog) {
        $id         = $blog->id;
        $title      = $blog->title;
        $content    = $blog->content;
?>

<h1> <?php echo $title; ?></h1>
<h1> <?php echo $content; ?> </h1>

<?php } ?>

另一种方法 - 访问 $blog 作为数组:

或者,您可以使用(文档$blog)变成一个数组:get_object_vars

<?php
    foreach($blogs as &$blog) {
        $blog     = get_object_vars($blog);
        $id       = $blog['id'];
        $title    = $blog['title'];
        $content  = $blog['content'];
?>

<h1> <?php echo $title; ?></h1>
<h1> <?php echo $content; ?> </h1>

<?php } ?> 

值得一提的是,这不一定适用于嵌套对象,因此它的可行性完全取决于$blog对象的结构。

比上述任何一个都好 - 内联 PHP 语法

说了这么多,如果你想以最易读的方式使用 PHP,以上都不是正确的。当 PHP 与 HTML 混合使用时,许多人认为最好的做法是使用 PHP 的替代语法,这会将整个代码从 9 行减少到 4 行:

<?php foreach($blogs as $blog): ?>
    <h1><?php echo $blog->title; ?></h1>
    <p><?php echo $blog->content; ?></p>
<?php endforeach; ?>

希望这有帮助。

于 2013-05-16T13:54:57.247 回答
31

$blog 是一个对象而不是一个数组

尝试使用$blog->id而不是$blog['id']

于 2013-05-16T13:29:56.520 回答
4

$blog 是一个对象,而不是一个数组,所以你应该像这样访问它:

$blog->id;
$blog->title;
$blog->content;
于 2013-05-16T13:30:17.563 回答
4

可能有两个问题

1) $blogs may be a stdObject

或者

2) The properties of the array might be the stdObject

尝试使用 var_dump($blogs) 并查看实际问题,如果数组的属性有 stdObject 试试这样

$blog->id;
$blog->content;
$blog->title;
于 2013-05-16T13:30:40.703 回答
4

如果您正在迭代对象而不是数组,则需要使用以下方法访问属性:

$id = $blog->id;
$title = $blog->title;
$content = $blog->content;

那,或者将您的对象更改为数组。

于 2013-05-16T13:54:32.153 回答
4

通过使用访问 StdClass 对象->

foreach ($blogs as $blog) {
    $id         = $blog->id;
    $title  = $blog->title;
    $content    = $blog->content;
}
于 2013-05-16T13:55:30.857 回答