2016-06-17 11 views
0

Ich prognostiziere Benutzerinteressen basierend auf Tag-Assoziationen. Diese Assoziationen werden in einem mehrzeiligen Diagramm mit ChartJS dargestellt. Ich kam zu dem Punkt, wo das Datenformat fast fertig ist, um auf der Client-Seite verwendet zu werden.Erweiterte Array-Wiederherstellung in PHP

Lassen Sie sich nicht von der Größe des Arrays abschrecken. Meine Frage ist ziemlich einfach, aber schwierig zu lösen, so scheint es.

Betrachten Sie die folgende Array (einschließlich Beispieldaten):

array:3 [▼ 
    "timespan" => "day", 
    "labels" => array:3 [▼ // Date labels based on timespan 
    0 => "2016-06-10" 
    1 => "2016-06-11" 
    2 => "2016-06-12" 
    ], 
    "data" => array:2 [▼ 
    0 => array:3 [▼ 
     "id" => 16473, 
     "name" => "FooTag" 
     "timeline" => array:3 [▼ 
     0 => array:3 [▼ 
      "Date" => "2016-06-10" 
      "Frequency" => 2 
      "Score" => 4.0 
     ] 
     1 => array:3 [▼ 
      "Date" => "2016-06-12" 
      "Frequency" => 2 
      "Score" => 4.0 
     ] 
     ] 
    ] 
    1 => array:3 [▼ 
     "id" => 10814, 
     "name" => "BarTag" 
     "timeline" => array:1 [▼ 
     0 => array:3 [▼ 
      "Date" => "2016-06-10" 
      "Frequency" => 2 
      "Score" => 3.0 
     ], 
     1 => array:3 [▼ 
      "Date" => "2016-06-11" 
      "Frequency" => 10 
      "Score" => 20.0 
     ] 
     ] 
    ] 
    ] 
] 

... stellen Sie sicher, jedes Datum Etikett (2016.06.10, 206-06-11, 2016.06.12) bedeckt ist, für jede Zeitleiste innerhalb data[i][timeline]. Wenn in der Zeitleiste für diese spezifische Datumsbezeichnung keine Daten verfügbar sind, muss ein leeres Array eingefügt werden.

wäre das Ergebnis:

array:3 [▼ 
    "labels" => array:3 [▼ // Date labels based on timespan 
    0 => "2016-06-10" 
    1 => "2016-06-11" 
    2 => "2016-06-12" 
    ] 
    "timespan" => "day" 
    "data" => array:2 [▼ 
    0 => array:3 [▼ 
     "id" => 16473, 
     "name" => "FooTag" 
     "timeline" => array:3 [▼ 
     0 => array:3 [▼ 
      "Date" => "2016-06-10" 
      "Frequency" => 2 
      "Score" => 4.0 
     ], 
     1 => array:0 [], // No data for label 2016-06-11, empty array added 
     2 => array:3 [▼ 
      "Date" => "2016-06-12" 
      "Frequency" => 2 
      "Score" => 4.0 
     ] 
     ] 
    ] 
    1 => array:3 [▼ 
     "id" => 10814, 
     "name" => "BarTag" 
     "timeline" => array:1 [▼ 
     0 => array:3 [▼ 
      "Date" => "2016-06-10" 
      "Frequency" => 2 
      "Score" => 3.0 
     ], 
     1 => array:3 [▼ 
      "Date" => "2016-06-11" 
      "Frequency" => 10 
      "Score" => 20.0 
     ], 
     2 => array:0 [], // No data for label 2016-06-12, empty array added 
     ] 
    ] 
    ] 
] 

In diesem Fall alle zugehörigen Tag-Daten für jeden Tag hat. Andernfalls stimmen die Daten (Häufigkeit und Punktzahl) nicht mit dem richtigen Datum überein, wenn das Diagramm gezeichnet wird.

Ich hoffe, das macht Sinn. Danke im Voraus!

+2

Klingt wie das Ergebnis beinhalten wird [ 'array_splice'] (http: //php.net/manual/en/function.array-splice.php). Versuchen Sie, dieses Problem zu lösen, als ob Sie nur mit einem einzelnen $ -Zeitplanarray und einem einzelnen $ -Argumentarray arbeiten. Sobald Sie das geschafft haben, sollte es ein wenig einfacher sein. –

Antwort

1

$array['labels'] Unter der Annahme, ist die endgültige Liste der Termine und $array['data'][$i]['timeline'] werden immer in aufsteigender Reihenfolge sortiert werden und nie Daten enthalten, die nicht in $array['labels']:

$labels = $array['labels']; 

foreach ($array['data'] as &$tag) { 
    foreach ($labels as $i => $date) { 
     if (!isset($tag['timeline'][$i]) || $tag['timeline'][$i]['Date'] != $date) { 
     $blank = []; 
     array_splice($tag['timeline'], $i, 0, [$blank]); 
     } 
    } 
} 
+0

Das stimmt, auch richtig. Ihre Antwort ist großartig und wirkt wie ein Zauber! – JasonK