2015-08-11 16 views
6

Cześć Jestem nowy w PHP, ale udało się zajść tak daleko w moich wymagań:muszę wyświetlać tylko jedną część JSON zakodowanej obiektu

Staram się wyświetlać tylko jedną część JSON zdekodowanego Obiektu. Nazwałem obiekt $Results.

mogę z powodzeniem używać var_dump ($Results); a następnie uzyskać pełne wyniki następująco:

object(stdClass)[2] 
    public '0' => 
    object(stdClass)[3] 
     public 'forename_1' => string 'JAMES' (length=5) 
     public 'middle1_1' => string '' (length=0) 
     public 'middle2_1' => string '' (length=0) 
     public 'middle3_1' => string '' (length=0) 
     public 'surname_1' => string 'TURNER' (length=7)  
    public 'Status' => int 100 

I włóż to w tabeli za pomocą następującego kodu:

<html> 
<form id="client-details" action="/details.php" method="post"> 
    <table> 
    <thead> 
     <tr> 
      <th>First Name</th> 
      <th>Surname</th> 
      <th>Search</th> 
     </tr> 
    </thead> 
<?php foreach($Results as $o):?> 
<tr> 
    <td id="forename"><?= $o->forename_1 ?></td> 
    <td id="surname"><?= $o->surname_1 ?></td> 
    <td><button type="submit" >More Info</button></td> 
</tr> 
<?php endforeach; ?> 
</table></form> 
</html> 

Herezje Problem Po wyświetleniu wyników pojawia się następujący błąd: "Uwaga: Próba uzyskania właściwości obiektu innego niż obiekt"

To wydaje się być, ponieważ próbuję uruchomić część obiektu public 'Status' => int 100.

Moje pytanie brzmi: W jaki sposób mogę zatrzymać tabelę przed próbą zapełnienia tego "stanu" lub w jaki sposób całkowicie go zignorować?

EDIT: Gdybym chciał mógłbym uzyskać wyniki z json_decode jako asocjacyjnej zamiast jako obiekty ... pomogłoby to mi się ignorować „Stan” array/przedmiot?

+0

Sprawdź kod po pobraniu wyników. – wilson

+0

Twój 'var_dump' pokazuje po prostu' $ Result' ma inny obiekt w '0', więc nie możesz uzyskać do niego dostępu. –

+0

@wilson - Sprawdziłem kod po pobraniu wyników: '$ Results = json_decode ($ Results);' Co mogę również zrobić, to zwrócić JSON jako tablicę asocjacyjną, wypowiadając '$ Results = json_decode ($ Results, true);'? – BLev80

Odpowiedz

3

Myślę, że źle się spisałeś. To, co robisz, polega na iteracji wszystkich zmiennych obiektu, tzn. Najpierw dostajesz publiczną zmienną 0 (która jest także obiektem), a po drugim uruchomieniu instrukcji otrzymujesz zmienną Status i wartość "Status" jest int i nie ma właściwości o nazwie "forename_1", więc pojawia się błąd, że właściwość nie istnieje.

Jeśli naprawdę chcesz to do pracy trzeba zmienić strukturę obiektu JSON, dzięki czemu można iteracyjne bezpo¶rednio na liście osób, które chcesz wyświetlić, takich jak:

object(stdClass)[2] 
    public 'list' => 
    array(0 => 
     object(stdClass)[3] 
      public 'forename_1' => string 'JAMES' (length=5) 
      public 'middle1_1' => string '' (length=0) 
      public 'middle2_1' => string '' (length=0) 
      public 'middle3_1' => string '' (length=0) 
      public 'surname_1' => string 'TURNER' (length=7)  
      public 'Status' => int 100, 
     1 => 
     object(stdClass)[3] 
      public 'forename_1' => string 'JAMES' (length=5) 
      public 'middle1_1' => string '' (length=0) 
      public 'middle2_1' => string '' (length=0) 
      public 'middle3_1' => string '' (length=0) 
      public 'surname_1' => string 'TURNER' (length=7)  
      public 'Status' => int 100, 
     2 => 
     object(stdClass)[3] 
      public 'forename_1' => string 'JAMES' (length=5) 
      public 'middle1_1' => string '' (length=0) 
      public 'middle2_1' => string '' (length=0) 
      public 'middle3_1' => string '' (length=0) 
      public 'surname_1' => string 'TURNER' (length=7)  
      public 'Status' => int 100 
    ) 

EDIT:

jeśli nie możesz lub nie chcesz zmienić struktury danych, uzyskaj wynik wywołania funkcji json_decode jako tablicę asocjacyjną, aw instrukcji foreach sprawdź, czy wymagane pole istnieje:

$Result = json_decode($data, true); 

<?php foreach($Results as $o):?> 
    <?php if(isset($o['forename_1']) && isset($o['surname_1'])): ?> 
     <tr> 
      <td id="forename"><?= $o['forename_1'] ?></td> 
      <td id="surname"><?= $o['surname_1'] ?></td> 
      <td><button type="submit" >More Info</button></td> 
     </tr> 
    <?php endif; ?> 
<?php endforeach; ?> 
+0

To bardzo przydatny komentarz! w moim konkretnym przypadku, nie mogę tego zrobić :(--- otrzymuję obiekt bezpośrednio od dostawcy usług internetowych i nie chcę odbudowywać żadnych danych ani wyników, zanim ich użyję – BLev80

0

Spróbuj tego:

<html> 
    <form id="client-details" action="/details.php" method="post"> 
     <table> 
     <thead> 
      <tr> 
       <th>First Name</th> 
       <th>Surname</th> 
       <th>Search</th> 
      </tr> 
     </thead> 
    <?php foreach($Results as $o=>$v){?> 
    <tr> 
     <td id="forename"><?= $v->forename_1 ?></td> 
     <td id="surname"><?= $v->surname_1 ?></td> 
     <td><button type="submit" >More Info</button></td> 
    </tr> 
    <?php } ?> 
    </table></form> 
    </html> 
+0

Próbowałem tego - bez powodzenia - "Status" "ciągle próbuje iterować – BLev80

0

próby drukowania tak:

<?php foreach($Results as $o):?> 
<tr> 
    <td id="forename"><?= $o['forename_1']; ?></td> 
    <td id="surname"><?= $o['surname_1'] ?></td> 
    <td><button type="submit" >More Info</button></td> 
</tr> 
<?php endforeach; ?> 
1

znalazłem rozwiązania możliwego do przyjęcia! Dodając true wewnątrz mojej linii json_decode:

$Results = json_decode($serviceResponse, true); 

I zwraca wynik jako asocjacyjnej zamiast obiektu.

Potem zmienił kod wewnątrz każdej <tr> następująco:

<html> 
.... (rest of code here) 
<?php foreach($Results as $person):?> 
     <tr> 
      <td id="forename"><?= $person['forename_1'] ?></td> 
      <td id="surname"><?= $person['surname_1'] ?></td> 
      <td><button type="submit" >More Info</button></td> 
     </tr> 
<?php endforeach; ?> 
    </table> 
    </form> 
</html> 

co teraz się dzieje, że ostateczna linia 'status' który wracał błąd jest tylko pusty wiersz. Chociaż nie jest to idealne rozwiązanie, nie mam nic przeciwko poradzeniu sobie z pustym wierszem tabeli, gdy przeglądam stronę jako HTML.

+0

Możesz ominąć to za pomocą instrukcji if:" if (isset ($ person ['forename_1']) && isset ($ person ['surname_1'])) "następnie wyświetl wiersz, w przeciwnym razie nic nie zrobisz –

+0

Próbowałem tego - nie działało ... może umieszczałem kod w niewłaściwym miejscu .. Uczę się tutaj;) – BLev80

+0

Edytowałem mój poprzedni post ... Zobacz, czy to ci pomoże ... –