2016-05-05 1 views
1

zu verarbeiten Ich habe eine funktionierende PHP-App in Bluemix ausgeführt, die ich erweitern möchte, um einen RESTful Service (Insights for Twitter) aufzurufen. Ich habe in der Lage, den Dienst zu nennen, den json Körpers abrufen und verwenden json_decode wie folgt ein Array zu erstellen:Wie komplexe Json-Objekt in PHP

$insightList = json_decode($guzzleResponse ->getBody(), true); 

aber ich kann nicht herausfinden, wie der Zugriff auf das Feld zu bekommen Ich bin Ich habe nach einer Lösung im Internet gesucht und einige Ansätze ausprobiert, die vielversprechend aussahen, aber als ich versuchte, sie zu integrieren, konnte ich sie nicht zur Arbeit bringen. Ich bin ein bisschen ein PHP-Neuling, wenn etwas nicht funktioniert, bin ich nicht sicher, wie es weitergeht.

Die json Struktur ist sehr komplex, mit drei Top-Level-Arrays - Suche, Tweets und nächsten. Ich bin an der zweiten dieser Tweets interessiert. Es ist ein ziemlich komplexes Array - es gibt einen Eintrag pro Tweet. Das Feld, das ich gerade möchte, ist tweets.cde.message.body. Sie können das vollständige Schema finden Sie hier: https://cdeservice.eu-gb.mybluemix.net/rest-api/#!/messages/getTweets

Dies ist der Code, den ich habe bisher:

foreach($insightList as $cde) { 
    foreach($cde as $message) { 
    $insight = $message['body']; 
    if(strlen($insight) > 60) { 
     $posts[] = array(
     'id' => 99999999, 
     //Temp; remove links from the text 
     'text' => $insight, 
     'category' => $insightCategory, 
     'image' => 'false' 
    );   
    } 
} 
} 

hier ein print_r von $ insightList:

[search] => Array (
    [results] => 28 
    [current] => 28 
    ) 
[tweets] => Array (
    [0] => Array (
     [cde] => Array (
      [author] => Array (
       [gender] => male 
       [parenthood] => Array (
        [isParent] => unknown 
        ) 
       [location] => Array (
        [country] => 
        ) 
       [maritalStatus] => Array (
        [isMarried] => unknown 
        ) 
       ) 
      [content] => Array (
       [sentiment] => Array (
        [evidence] => Array () 
        [polarity] => NEUTRAL 
        ) 
       ) 
      ) 
     [message] => Array (
      [postedTime] => 2015-01-13T09:42:16.000Z 
      [verb] => share 
      [link] => http://twitter.com/zWDOM/statuses/554936456477933569 
      [generator] => Array (
       [displayName] => Twitter Web Client 
       [link] => http://twitter.com 
       ) 
      [body] => RT @VisualSuccess: "Mainframe & Cloud" Magazine wurde soeben publiziert! http://www.twitter.com @zWDOM @Rocket @JohnKnutson_IBM 
      [favoritesCount] => 0 
      [objectType] => activity 
      [actor] => Array (
       [summary] => Seit über 25 Jahren im Mainframebereich, derzeit als Senior Consultant und IT Architekt für zEnterprise und Projektmanager beim IBM BP Cancom in Köln 
       [image] => https://pbs.twimg.com/profile_images/424202233463308288/XQquUcnh_normal.jpeg 
       [statusesCount] => 2309 
       [utcOffset] => 3600 
       [languages] => Array (
        [0] => de 
        ) 
       [preferredUsername] => zWDOM 
       [displayName] => Willi Domroese 
       [postedTime] => 2009-12-17T01:39:25.000Z 
       [link] => http://www.twitter.com/zWDOM 
       [verified] => 
       ) 
      [provider] => Array (
       [displayName] => Twitter 
       [link] => http://www.twitter.com 
       [objectType] => service 
       ) 
      [twitter_filter_level] => medium 
      [twitter_entities] => Array (
       [urls] => Array (
        [0] => Array (
         [display_url] => ln.is/paper.li/visua… 
         [indices] => Array (
          [0] => 77 
          [1] => 99 
          ) 
         [expanded_url] => http://ln.is/paper.li/visualsucce/7zYNk 
         [url] => http://www.twitter.com 
         ) 
        ) 
       [hashtags] => Array () 
       [user_mentions] => Array (
        [0] => Array (
         [indices] => Array (
          [0] => 3 
          [1] => 17 
          ) 
         [screen_name] => VisualSuccess 
         [id_str] => 213337792 
         [name] => Predrag Gasic 
         [id] => 213337792 
         ) 
        [1] => Array (
         [indices] => Array (
          [0] => 101 
          [1] => 107 
          ) 
         [screen_name] => zWDOM 
         [id_str] => 97334013 
         [name] => Willi Domroese 
         [id] => 97334013 
         ) 
        [2] => Array (
         [indices] => Array (
          [0] => 108 
          [1] => 115 
          ) 
         [screen_name] => Rocket 
         [id_str] => 870584947 
         [name] => Rocket Software 
         [id] => 870584947 
         ) 
        [3] => Array (
         [indices] => Array (
          [0] => 116 
          [1] => 132 
          ) 
         [screen_name] => JohnKnutson_IBM 
         [id_str] => 16452310 
         [name] => John Knutson 
         [id] => 16452310 
         ) 
        ) 
       [trends] => Array () 
       [symbols] => Array () 
       ) 
      [twitter_lang] => de 
      [id] => tag:search.twitter.com,2005:554936456477933569 
      [retweetCount] => 1 
      [gnip] => Array (
       [urls] => Array (
        [0] => Array (
         [expanded_url] => http://linkis.com/paper.li/visualsucce/7zYNk 
         [expanded_status] => 200 
         [url] => http://www.twitter.com 
         ) 
        ) 
       [language] => Array (
        [value] => de 
        ) 
       ) 
      [object] => Array (
       [postedTime] => 2015-01-13T08:04:48.000Z 
       [verb] => post 
       [link] => http://twitter.com/VisualSuccess/statuses/554911928527888384 
       [generator] => Array (
        [displayName] => Linkis.com 
        [link] => http://linkis.com 
        ) 
       [body] => "Mainframe & Cloud" Magazine wurde soeben publiziert! http://www.twitter.com ://www.twitter.com 
       [objectType] => activity 
       [actor] => Array (
        [summary] => Ù† (N), Wirtschaftsinformatiker | SAP Consultant Logistics #bigdata #appdevelopment #webdesign #eCommerce #SocialMedia #contentmarketing #SmartHome #Journal 
        [image] => https://pbs.twimg.com/profile_images/2841607223/959b0d23646b1f24bd7b70deac160e2f_normal.jpeg 
        [statusesCount] => 14185 
        [utcOffset] => 3600 
        [languages] => Array (
         [0] => de 
         ) 
        [preferredUsername] => VisualSuccess 
        [displayName] => Predrag Gasic 
        [postedTime] => 2010-11-08T17:19:27.000Z 
        [link] => http://www.twitter.com/VisualSuccess 
        [verified] => 
        ) 
       [provider] => Array (
        [displayName] => Twitter 
        [link] => http://www.twitter.com 
        [objectType] => service 
        ) 
       [twitter_filter_level] => low 
       [twitter_entities] => Array (
        [urls] => Array (
         [0] => Array (
          [display_url] => ln.is/paper.li/visua… 
          [indices] => Array (
           [0] => 58 
           [1] => 80 
           ) 
          [expanded_url] => http://ln.is/paper.li/visualsucce/7zYNk 
          [url] => http://www.twitter.com 
          ) 
         ) 
        [hashtags] => Array () 
        [user_mentions] => Array (
         [0] => Array (
          [indices] => Array (
           [0] => 82 
           [1] => 88 
           ) 
          [screen_name] => zWDOM 
          [id_str] => 97334013 
          [name] => Willi Domroese 
          [id] => 97334013 
          ) 
         [1] => Array (
          [indices] => Array (
           [0] => 89 
           [1] => 96 
           ) 
          [screen_name] => Rocket 
          [id_str] => 870584947 
          [name] => Rocket Software 
          [id] => 870584947 
          ) 
         [2] => Array (
          [indices] => Array (
           [0] => 97 
           [1] => 113 
           ) 
          [screen_name] => JohnKnutson_IBM 
          [id_str] => 16452310 
          [name] => John Knutson 
          [id] => 16452310 
          ) 
         ) 
        [trends] => Array () 
        [symbols] => Array (
        ) 
       ) 
      ) 
     ) 
    ) 

Antworten auf diese Frage wären sehr geschätzt

+1

"Das Feld, das ich gerade möchte, ist tweets.cde.message.body" 'Nachricht' ist kein Kind von' cde'. –

+0

Stimmen Sie mit @Niet überein, Sie haben Ihre print_r falsch gelesen. Einrückung ist wichtig, eingerückte Objekte sind Teil eines Unterarrays. Siehe meine Antwort. – gview

+0

Beachten Sie, dass Sie, wenn Sie eine JSON-Antwort erwarten, einfach '$ guzzleResponse-> json()' tun können. – Sammitch

Antwort

3

Iterating $insightList bringt Sie nicht auf die Cde-Ebene. Und du willst eigentlich nicht die cde; Sie möchten die Nachricht.

Iterieren Sie einfach die Tweets. Sie benötigen keine foreach, um Schlüsselinformationen aus einem PHP-Array zu erhalten.

foreach($insightList['tweets'] as $tweet) { 
     $insight = $tweet['message']['body']; 
     if(strlen($insight) > 60) { 
      $posts[] = array(
      'id' => 99999999, 
      //Temp; remove links from the text 
      'text' => $insight, 
      'category' => $insightCategory, 
      'image' => 'false' 
     );   
    } 
} 
+0

Danke @ mkasberg - Ich habe diesen Code eingefügt und es hat super funktioniert. Ich hatte gehofft, dass Sie so etwas tun könnten, aber ich wusste nicht, wie ich es schreiben sollte. Dies wird mir sehr helfen, da ich mehr Felder benötige. –

1

es von Ihrem print_r mir sieht das, was Sie wollen, ist an:

echo $insightList[0]['message']['body']; 

Wenn es gibt einen Abschnitt dieses wie [some_key], dann ‚some_key‘ ist ein assoziatives Array Schlüssel, und Sie kann auf diese Elemente zugreifen, seien es zusätzliche Arrays oder ein Wert, unter Verwendung des Schlüsselnamens, wie ich hier dargestellt habe.

+0

Danke, @gview, für das nützliche Snippet und die Erklärung. By the way, als ich sah, wie SE den JSON formatierte, erkannte ich auch, dass Körper in Nachricht war ;-) –

+0

Froh, zu helfen. Sie können natürlich auch, wie Sie bereits herausgefunden haben, ein PHP-Objekt und nicht ein Array zurückgeben, und in einigen Fällen können Sie feststellen, dass Sie dadurch eine natürlichere Möglichkeit erhalten, die API-Dokumentation abzugleichen. Du hättest wahrscheinlich ein Array von Objekten erhalten, durch die man hindurchgehen könnte, aber dann wäre die Syntax etwa so: $ obj-> message-> body; – gview