2013-05-16 37 views
17

Tôi đã cố gắng để sao chép mã này:PHP Lỗi: Không thể sử dụng đối tượng của loại stdClass như mảng (mảng và đối tượng vấn đề)

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

và đây là mã của tôi:

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

tôi nhận được lỗi này mỗi khi tôi chạy mã của tôi: "không thể sử dụng đối tượng của loại stdClass như mảng"

+1

Hãy thử cú pháp đối tượng thay vào đó: '$ blog-> id' – str

+0

cũng $ blog dường như là một đối tượng. Chỉ cần print_r() các blog $ của bạn để xem xét cấu trúc của nó – thpl

+0

cố gắng sử dụng -> toán tử –

Trả lời

49

Ví dụ bạn sao chép từ đang sử dụng dữ liệu dưới dạng mảng giữ mảng, bạn đang sử dụng dữ liệu dưới dạng một đối tượng giữ mảng. Các đối tượng và mảng không giống nhau và do đó chúng sử dụng các cú pháp khác nhau để truy cập dữ liệu.

Nếu bạn không biết tên biến, chỉ cần thực hiện var_dump($blog); trong vòng lặp để xem chúng.

Cách đơn giản nhất phương pháp - truy cập $ blog như một đối tượng trực tiếp:

Try (giả định các biến là chính xác):

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

Giải pháp thay thế phương pháp - truy cập $ blog như một mảng:

Hoặc, bạn có thể biến $blog thành một mảng với get_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 } ?> 

Nó đáng nói rằng điều này không nhất thiết sẽ làm việc với các đối tượng lồng nhau nên khả năng tồn tại của nó hoàn toàn phụ thuộc vào cấu trúc của đối tượng $blog của bạn.

Tốt hơn so với một trong hai bên trên - Inline PHP Cú pháp

Có nói tất cả những gì, nếu bạn muốn sử dụng PHP theo cách dễ đọc nhất, không phải những điều trên là đúng. Khi sử dụng PHP trộn lẫn với HTML, nó được coi là thực hành tốt nhất được nhiều người sử dụng PHP alternative syntax, điều này sẽ làm giảm toàn bộ mã của bạn 9-4 dòng:

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

Hy vọng điều này giúp đỡ.

+0

Đã làm cho tôi! Tôi đang xử lý một API bên ngoài đẫm máu có kết quả có các khóa như "F_123123123" và cũng "-105". – MikingTheViking

16

$ blog là một đối tượng không phải là một mảng

thử sử dụng $blog->id thay vì $blog['id']

+0

cảm ơn bạn, bạn giải quyết vấn đề của tôi. nhưng, tôi có mã này mà tôi đã cố gắng sao chép. đây rồi. –

+0

http://stackoverflow.com/questions/16589313/php-error-cannot-use-object-of-type-stdclass-as-array –

2

$ blog là một đối tượng, không phải là một mảng, vì vậy bạn nên truy cập vào nó như vậy:

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

Có thể hai vấn đề

1) $blogs may be a stdObject 

hoặc

2) The properties of the array might be the stdObject 

Hãy thử sử dụng var_dump ($ blog) và xem vấn đề thực tế nếu thứ tính điện tử của mảng có stdObject thử như thế này

$blog->id; 
$blog->content; 
$blog->title; 
+0

Một var_dump nhanh() của mỗi có thể theo thứ tự. – TML

1

Nếu bạn đang iterating trên một đối tượng thay vì một mảng, bạn sẽ cần phải truy cập vào các tính chất sử dụng:

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

đó, hoặc thay đổi đối tượng của bạn vào một mảng.

+0

tôi muốn mã của tôi trông giống như từ nơi tôi sao chép mã. tại sao tôi phải thay đổi nó như thế? isnt mã từ nơi tôi đang sao chép là sai? –

2

stdClass Object được truy cập bằng cách sử dụng ->

foreach ($blogs as $blog) { 
    $id   = $blog->id; 
    $title = $blog->title; 
    $content = $blog->content; 
} 
+0

có ... nhưng tôi đã tự hỏi tại sao tôi không thể sao chép mã ở trên. như thế này \t foreach ($ blog là $ blog) { \t \t \t $ id \t \t = $ blog ['id']; \t \t \t $ title \t \t = $ blog ['title']; \t \t \t $ content \t = $ blog ['content']; ? \t> \t \t \t \t \t \t

\t \t \t

+1

@EmmanuelJosephUBastero - Bạn không thể sao chép mã vì chúng đang làm việc với một mảng các mảng và bạn đang làm việc với một mảng các đối tượng. Nó giống như hỏi tại sao bạn không thể sao chép cách một người lái xe trên một chiếc xe đạp một bánh, họ là những công cụ hoàn toàn khác nhau. Tôi giải thích trong câu trả lời của tôi làm thế nào để biến các đối tượng của bạn thành mảng. –

Các vấn đề liên quan