2017-06-02 1 views
1

Ich habe Mühe, diese Arbeit zu machen, und ich hoffe, jemand kann mir einen Schub in die richtige Richtung geben. Ich erstelle ein Dashboard, das Daten aus mehreren Quellen abruft: Google Analytics, Google Trends und so weiter. Damit ein Proof of Concept zu sein, versuche ich, durch die Verwendung einer JSON-Datei mit der folgenden Struktur der verschiedenen Quellen zu emulieren:Fange JSON-Daten nach spezifischem Wert

{ 
    "data": 
    [ 
    { 
     "source":"google analytics", 
     "data": 
     [ 
     { 
      "month":"jan", 
      "visitors":"593" 
     }, 
     { 
      ... 
     } 
     ] 
    }, 
    { 
     "source":"google trends", 
     "keywords": 
     [ 
     { 
      "value":"keyword 1", 
      "data": 
      [ 
      { 
       "month":"dec", 
       "popularity":"10" 
      }, 
      { 
       ... 
      } 
      ] 
     }, 
     { 
      "value":"keyword 2", 
      "data": ... 
     } 
     ] 
    } 
    ] 
} 

Next Ich habe eine Dropdown-Liste mit Keywords aus einer MySQL-Datenbank-Abfrage. Wenn ein Benutzer ein Schlüsselwort aus dieser Liste auswählt, möchte ich die Daten aus der JSON-Datei anzeigen, die diesem bestimmten Schlüsselwort entsprechen.

Zum Beispiel, wenn ein Benutzer „keyword 1“ aus der Dropdown-Liste auswählt, müssen die Werte „Dec“ und „100“ geholt werden, die Rechte von Chart.js

jetzt verwendet wird, dann ich haben folgendes Stück Code:

$dataFile = json_decode(file_get_contents($src)); 
$data = $dataFile->data[1]->keywords[0]; // Google Trends 

foreach ($data->results as $result) { 
    echo "<li><p>" . $result->month . "</p></li>"; 
    echo "<li><p>" . $result->popularity . "</p></li>"; 
} 

Diese die richtigen Daten nicht zeigt, die Monate und die Popularität Partituren zu sein, aber offensichtlich nur für das Schlüsselwort unter Verwendung des Array-Wertes definiert. Wie kann ich diese Show-Daten für das ausgewählte Keyword machen (welches über GET gepostet wird)?

Was ich versuche zu tun ist:

$dataFile = json_decode(file_get_contents($src)); 
$data = $dataFile->data["google trends"]->keywords[$selectedKeyword]; 

foreach ($data->results as $result) { 
    echo "<li><p>" . $result->month . "</p></li>"; 
    echo "<li><p>" . $result->popularity . "</p></li>"; 
} 

Ich bin mir bewusst, der zweite Parameter von json_decode, die es ein assoziatives Array macht, aber ich bin nicht sicher, wie ich es verwenden können, um zu erreichen was ich versuche ..

Dies zu tun, ist zur Zeit das Ergebnis der Daten $:

object(stdClass)#10 (2) { 
    ["value"]=> 
    string(10) "keyword 1" 
    ["data"]=> 
    array(7) { 
    [0]=> 
    object(stdClass)#11 (2) { 
     ["month"]=> 
     string(3) "dec" 
     ["popularity"]=> 
     string(2) "10" 
    } 
    [1]=> 
    object(stdClass)#12 (2) { 
     ["month"]=> 
     string(3) "jan" 
     ["popularity"]=> 
     string(1) "5" 
    } 
    [2]=> 
    object(stdClass)#13 (2) { 
     ["month"]=> 
     string(3) "feb" 
     ["popularity"]=> 
     string(1) "8" 
    } 
    [3]=> 
    object(stdClass)#14 (2) { 
     ["month"]=> 
     string(3) "mar" 
     ["popularity"]=> 
     string(1) "5" 
    } 
    [4]=> 
    object(stdClass)#15 (2) { 
     ["month"]=> 
     string(3) "apr" 
     ["popularity"]=> 
     string(2) "10" 
    } 
    [5]=> 
    object(stdClass)#16 (2) { 
     ["month"]=> 
     string(3) "mei" 
     ["popularity"]=> 
     string(2) "20" 
    } 
    [6]=> 
    object(stdClass)#17 (2) { 
     ["month"]=> 
     string(3) "jun" 
     ["popularity"]=> 
     string(2) "10" 
    } 
    } 
} 
+0

Diese Frage scheint ein wenig zu vieldeutig. Es ist nicht klar, was nicht funktioniert oder warum Sie javascript/jquery getaggt haben. Bitte klären Sie. – Twisty

+0

Können Sie bitte eine 'var_export (data);' und aktualisieren Sie Ihre Post mit den Ergebnissen? – mkaatman

+0

@mkaatman Ich habe meine Antwort aktualisiert. –

Antwort

1

Sie können auf diese Weise nicht dynamisch zu graben, Zugriff auf das Objekt mit gegebenen Eingabe JSON-Datei, was Sie tun können, ist wie folgt

$selected_keyword = 'keyword 1'; 

$dataFile = json_decode(file_get_contents($src)); 


foreach($dataFile->data as $trend) 
{ 
    /* Source you are looking */ 
    if($trend->source == 'google trends') 
    { 
     foreach($trend->keywords as $keyword) 
     { 
      /* Keyword which I am looking for */ 
      if($keyword->value == $selected_keyword) 
      { 
       foreach ($keyword->data as $result) 
       { 
        echo "<li><p>" . $result->month . "</p></li>"; 
        echo "<li><p>" . $result->popularity . "</p></li>"; 
       } 
      } 
     } 
    } 

} 

Hier Test-Ergebnisse

Eingang - t.json

[email protected]:/tmp$ cat t.json 
{ 
    "data": 
    [ 
    { 
     "source":"google analytics", 
     "data": 
     [ 
     { 
      "month":"jan", 
      "visitors":"593" 
     } 

     ] 
    }, 
    { 
     "source":"google trends", 
     "keywords": 
     [ 
     { 
      "value":"keyword 1", 
      "data": 
      [ 
      { 
       "month":"dec", 
       "popularity":"100" 
      } 
      ] 
     }, 
     { 
      "value":"keyword 2", 
      "data": [] 
     } 
     ] 
    } 
    ] 
} 

Script - t.php

[email protected]:/tmp$ cat t.php 
<?php 

$selected_keyword = 'keyword 1'; 

$dataFile = json_decode(file_get_contents('t.json')); 

/* Your input */ 
print_r($dataFile); 

foreach($dataFile->data as $trend) 
{ 
    /* Source you are looking */ 
    if($trend->source == 'google trends') 
    { 
     foreach($trend->keywords as $keyword) 
     { 
      if($keyword->value == $selected_keyword) 
      { 
       foreach ($keyword->data as $result) 
       { 
        /* Your output */ 
        echo "<li><p>" . $result->month . "</p></li>"; 
        echo "<li><p>" . $result->popularity . "</p></li>"; 
       } 
      } 
     } 
    } 

} 
?> 

Execution & Ausgabe

[email protected]:/tmp$ php t.php 
stdClass Object 
(
    [data] => Array 
     (
      [0] => stdClass Object 
       (
        [source] => google analytics 
        [data] => Array 
         (
          [0] => stdClass Object 
           (
            [month] => jan 
            [visitors] => 593 
           ) 

         ) 

       ) 

      [1] => stdClass Object 
       (
        [source] => google trends 
        [keywords] => Array 
         (
          [0] => stdClass Object 
           (
            [value] => keyword 1 
            [data] => Array 
             (
              [0] => stdClass Object 
               (
                [month] => dec 
                [popularity] => 100 
               ) 

             ) 

           ) 

          [1] => stdClass Object 
           (
            [value] => keyword 2 
            [data] => Array 
             (
             ) 

           ) 

         ) 

       ) 

     ) 

) 
<li><p>dec</p></li><li><p>100</p></li> 
+0

Entschuldigung für die späte Antwort. Vielen Dank für Ihre Antwort, die Aufschlüsselung hilft mir wirklich zu verstehen, was vor sich geht. –

1

Ihr erstes Beispiel scheint zu ignorieren, dass alle Ihre Keyword-Ergebnisse werden unter einem Datenobjektschlüssel subgrouped. Sie haben einige Sammlungen im JSON-Objekt, die iteriert werden müssen, um auf die nächste Ebene zugreifen zu können. Das folgende Beispiel ist eine Möglichkeit, in ein Datenobjekt

$dataFile = json_decode(file_get_contents($src)); 

$source = getSource($dataFile->data, $dataSource); 

foreach ($source->keywords as $group) { 
    if ($group->value === $selectedKeyword) { 
    buildList($group); 
    } 
} 

function buildList($group) 
{ 
    foreach ($group->data as $listItem) { 
    echo "<li><p>" . $listItem->month . "</p></li>"; 
    echo "<li><p>" . $listItem->popularity . "</p></li>"; 
    } 
} 


function getSource($dataCollection, $key) 
{ 
    foreach ($dataCollection as $entry) { 
    if ($entry->source === $key) { 
     return $entry; 
    } 
    } 
} 
+0

Entschuldigung für die späte Antwort. Genau das habe ich gebraucht. Vielen Dank! Macht jetzt viel mehr Sinn. –

Verwandte Themen