web-dev-qa-db-ja.com

PHPエラー:stdClass型のオブジェクトを配列として使用できません(配列とオブジェクトの問題)

私はこのコードをコピーしようとしていた:

<?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型のオブジェクトを配列として使用できません」

コピー元の例では、配列を保持している配列の形式のデータを使用しています。オブジェクトを保持している配列の形式のデータを使用しています。オブジェクトと配列は同じではないため、データにアクセスするために異なる構文を使用します。

変数名がわからない場合は、ループ内でvar_dump($blog);を実行するだけで変数を確認できます。

最も簡単な方法-オブジェクトとして$ 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にアクセス:

または、$blogget_object_varsで配列に変換できる場合があります( documentation ):

<?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 PHPの 代替構文 を使用する多くの人がベストプラクティスと見なしているため、コード全体が9行から4行に削減されます。

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

これが役に立てば幸いです。

59
Glitch Desire

$ blogは配列ではなくオブジェクトです

$blog->idの代わりに$blog['id']を使用してみてください

24
Anigel

$ blogは配列ではなくオブジェクトなので、次のようにアクセスする必要があります。

$blog->id;
$blog->title;
$blog->content;
4
Software Guy

2つの問題があるかもしれません

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;
4
chandresh_cool

配列ではなくオブジェクトを反復処理する場合、次を使用してプロパティにアクセスする必要があります。

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

または、オブジェクトを配列に変更します。

3
CashIsClay

StdClassオブジェクトにアクセスするには、->

foreach ($blogs as $blog) {
    $id         = $blog->id;
    $title  = $blog->title;
    $content    = $blog->content;
}
3
Yogesh Suthar