2013-05-16 13 views
17

starałem się skopiować ten kod:PHP błąd: Nie można korzystać z obiektu typu stdClass jak array (kwestie tablicy i obiekt)

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

i tu jest mój kod:

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

otrzymuję ten błąd za każdym razem uruchomić mój kod: „nie można użyć obiektu typu stdClass jako tablicy”

+1

Zamiast tego wypróbuj składnię obiektów: '$ blog-> id' – str

+0

również blog $ wydaje się być obiektem. Po prostu print_r() twoje $ blogi sprawdzają jego strukturę – thpl

+0

spróbuj użyć -> operator –

Odpowiedz

49

W przykładzie, z którego skopiowano dane, w postaci tablicy zawierającej tablice, wykorzystywane są dane w postaci obiektów tablicowych. Obiekty i tablice nie są takie same iz tego powodu używają różnych składni do uzyskiwania dostępu do danych.

Jeśli nie znasz nazw zmiennych, po prostu wykonaj w pętli var_dump($blog);, aby je zobaczyć.

Najprostsza metoda - dostęp $ blog jako obiekt bezpośrednio:

Try (zakładając, że te zmienne są poprawne):

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

Alternatywna metoda - dostęp $ blog jako tablicę:

Alternatywnie, możesz zamienić $blog w tablicę z 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 } ?> 

Warto wspomnieć, że to nie jest koniecznie będzie działać z obiektów zagnieżdżonych więc jego żywotność całkowicie zależy od struktury obiektu $blog.

lepiej niż którykolwiek z powyższym - Inline składni PHP

Powiedziawszy to wszystko, jeśli chcesz korzystać z PHP w najbardziej czytelny sposób, żadna z wyżej mają rację. Kiedy PHP wymieszany z HTML, jest uważany przez wielu najlepszych praktyk w obsłudze PHP alternative syntax, zmniejszyłoby to cały swój kod z dziewięciu do czterech liniach:

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

nadzieję, że to pomogło.

+0

Zrobiłem to dla mnie! Mam do czynienia z krwawym zewnętrznym API, którego wynik ma klucze takie jak "F_123123123", a także "-105". – MikingTheViking

16

$ blog nie stanowi przedmiot tablicą

spróbuj $blog->id zamiast $blog['id']

+0

dziękuję Ci rozwiązać mój problem. ale mam ten kod, który próbowałem skopiować. oto jest. –

+0

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

2

$ bloga jest przedmiotem, a nie tablicą, należy więc go tak:

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

Może dwie kwestie

1) $blogs may be a stdObject 

lub

2) The properties of the array might be the stdObject 

Spróbuj użyć var_dump ($ blogs) i zobacz aktualny problem, jeśli Właściwości e tablicy mają stdObject spróbować jak to

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

Szybka var_dump() każdej może być w porządku. – TML

1

Jeśli iteracji nad obiektem zamiast tablicy, trzeba uzyskać dostęp do właściwości używając:

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

To, czy zmiana Twój obiekt do tablicy.

+0

Chcę, aby mój kod wyglądał tak, jak z miejsca, w którym skopiowałem kod. dlaczego muszę to zmienić? czy kod, z którego kopiuję, nie jest prawidłowy? –

2

stdClass obiekt jest dostępny za pomocą ->

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

tak ... ale zastanawiałem się, dlaczego nie mogę skopiować powyższy kod. jak to \t foreach ($ blogi as $ bloga) { \t \t \t $ ID \t \t = $ strony [ 'id']; \t \t \t $ title \t \t = $ blog ['title']; \t \t \t $ treść \t = $ blog ["treść"]; ? \t> \t \t \t \t \t \t

\t \t \t

+1

@EmmanuelJosephUBastero - Nie można skopiować kodu, ponieważ pracują z tablicą tablic i pracujesz z wieloma obiektami. To tak, jakby zapytać, dlaczego nie można skopiować, jak ktoś jeździ samochodem na motocyklu, są to zupełnie różne narzędzia. W swojej odpowiedzi wyjaśniłem, jak zamienić obiekty w tablice. –

Powiązane problemy