2017-11-26 1 views
0

Ich habe zwei PHP-Strings, die wie folgt aussieht (offensichtlich für die Frage verkürzt):PHP Array JS-Array und Umstrukturierung

$year [ 
    [0]=>2003 
    [1]=>2003 

    [2]=>2004 
    [3]=>2004 

    [4]=>2005 
    [5]=>2005 



] 

$cost [ 
    [0]=>200 
    [1]=>300 
    [2]=>400 
    [3]=>500 
    [4]=>410 
    [5]=>510 
]  

Ich brauche die PHP-Arrays oben in eine JavaScript-Array drehen genau wie unten formatiert :

 var newData=[    
      ['2003', 200,300], 
      ['2004', 400,500], 
      ['2005', 410,510]  
     ]; 

Wenn ich implizit (wie oben) in der JS-Array geben alle gut funktioniert (dh die Grafiken machen richtig). Nach einigen Stunden des Ausprobierens verschiedener Ansätze kann ich jedoch nicht herausfinden, wie man das Array newData dynamisch (dh von PHP-Arrays wie gezeigt) in genau dem gezeigten JS-Array-Format erzeugt.

+0

Wie wissen Sie, wie viele Einträge von 2003 aufweisen und die von ihnen sollte von $ Kosten nehmen? – legomolina

+0

Bringen Sie uns einen Schritt zurück, wie Sie diese Arrays erstellt haben.Effizienter, dort zu starten – charlietfl

+0

@legomolina die zwei PHP-Arrays sind so hergestellt, dass der Schlüssel jedes Arrays immer den Schlüssel des anderen übereinstimmt. Also, welcher Schlüsselwert auch für array ($ year) ist, wird Array ($ cost) entsprechen. Ich werde das Frage-Beispiel erweitern, um Ihnen zu zeigen, – WChris

Antwort

1

Ihre Aufgabe kann in zwei Aufgaben aufgeteilt werden: Zunächst wollen Sie beide Arrays kombinieren. Ich nehme an, dass Sie dies basierend auf den Schlüsseln tun möchten, die sie haben. Dafür gibt es in PHP mehrere Funktionen wie array_combine oder array_reduce. Aber für Ihren Fall ist der einfachste Weg eine for_each Schleife, weil Sie doppelte Werte im $ Jahr Array haben.

$combined_array = []; 
foreach ($year as $id => $year_val) { 
    if (!array_key_exists($year_val, $combined_array)) { 
     $combined_array[$year_val] = [(string)$year_val]; 
    } 
    $combined_array[$year_val][] = $cost[$id]; 
} 

Jetzt haben Sie die Jahre als Schlüssel, was Sie nicht wollen, so können Sie array_values verwenden können, die Schlüssel wieder zu entfernen.

$combined_array = array_values($combined_array); 

Die zweite Aufgabe ist ganz einfach: Gehen Sie auf die PHP-Datei, die das Skript Sie das Array zur Verfügung stellen möchten lädt. Fügen Sie diese, bevor Sie das Skript laden:

<script> 
    var myPhpArray = <?php echo json_encode($combined_array) ?>; 
</script> 

Danach wird das PHP-Array von JS in der Variablen `myPhpArray zugänglich ist.

+0

Vielen Dank. Ich denke, dass das, was ich nicht richtig mache, JSON.parse ist. Ich habe das PHP-Array in Ordnung umstrukturiert. Und ich habe verwendet (js) var array = ""; ..... aber das ist gescheitert (obwohl ich diese Methode vorher ohne Probleme benutzt habe)? – WChris

+0

Es tut mir leid. Ich habe den Teil JSON.parse entfernt, weil dies nicht notwendig ist. Gültiges JSON wird von der JS-Engine automatisch als JS-Variable analysiert. –

+0

@WChris, verwenden Sie nicht die Anführungszeichen zwischen Ihrem PHP-Echo-Aufruf. Es wird Ihr Javascript den Code als String interpretieren und es als JavaScript-Code interpretieren, der strukturiert und arrayiert. – BigBlast

1

, wenn Sie die Struktur im Beispiel respektieren, würde die folgenden die Arbeit machen:

<?php 

$year = [ 
    0 => 2003, 
    1 => 2003, 
    ... 
]; 

$cost = [ 
    0 => 200, 
    1 => 300, 
    ... 
]; 

for($i=0;$i<SIZE_OF_ARRAY;$i+=2) 
    $newData[] = [(string) $year[$i], $cost[$i], $cost[$i+1]]; 

?> 

Jetzt in der JavaScript-Teil des Codes müssen Sie nur:

<script> 
    var newData = <?= json_encode($newData); ?> 
</script> 

Bitte beachte, dass ich den Ball hielt Verwenden Sie die Anführungszeichen zwischen dem PHP-Code, weil ich möchte, dass das Javascript die PHP-Ausgabe als Javascript-Code und nicht als Javascript-String analysiert.

+0

@BigBlastThat hilft bei der Strukturierung der PHP-Daten, aber das Problem, mit dem ich das Problem habe, repliziert es in JS genau ...... json_encode (); fails – WChris

+0

nein nein, du brauchst nur: 'var newData = ;' oder, wenn du 'short_open_tags' in deiner php.ini nicht aktiviert hast,' var newData = BigBlast

+0

ja das war was ich vor SO Post versucht habe. Es passiert jedoch nicht. Hmmm ... zumindest mache ich nicht wirklich etwas Dummes. Und dafür ein upvote Sir – WChris

1

Danke für die Hilfe. Ihre Antworten zeigten, dass ich die Dinge richtig angehen würde (json_encode usw.). Was jedoch passiert ist, ist, dass das Legacy-System, das die PHP-Arrays erzeugt, die Werte für ganze Zahlen und nicht für Strings korrigiert hat. Das Empfänger-Plug-In benötigt INTs - siehe das Ausgabearray Format in der Frage

So json_encoding das PHP-Array funktionierte OK - aber es war Codierung Zeichenfolge anstelle von INT Datenwerte. Das wurde behoben und jetzt scheint alles in Ordnung zu sein.

PS Wenn Sie sich die ursprüngliche Frage ansehen, werden Sie sehen, dass das OP-Array in JS zwei Datentypen benötigt. Und natürlich bekam es nur Fäden. Lektion dort sicher!

Heres das Snippet

   var a = ['1','2','3']; 
      var result = a.map(function (x) { 
      return parseInt(x, 10);