2016-01-26 11 views
5

Ich habe eine Anwendung in PHP und JS. Wenn ich das json-kodierte PHP-Array EVAL ausarbeite, ändert sich die Array-Sortierung. wenn ich ein Array in PHP wie dies zum Beispiel habe:Funktioniert die Funktion js EVAL die Position der Elemente?

<?php 
$array = [148 => 'Plane', 149 => 'Car']; 
?> 

<script> 
var array = eval(<?php echo json_encode($array)?>); 
</script> 

Wenn ich das Array in der Konsole drucke, werden die Elemente nicht die gleiche Position haben. Weißt du wie das passieren kann?

UPDATE

Danke für die Antworten, aber ich die genau gleiche Reihenfolge in einer JS Struktur behalten will, so will ich nicht das Array von einem bestimmten Feld bestellen. Vielleicht ist die Reihenfolge von der DB erhalten ist, wie:

[148 => object, 155 => object, 133 => object] 

ich mit dem um ein Array wie folgt in JS erstellen möchte dass sie (die Position kam von DB und es hat diese Ordnung zu sein). Ist es möglich?

+0

Sie brauchen nicht eval. 'var array = ;' ist ausreichend. –

Antwort

8
<?php echo json_encode($array)?> 

Da das Array spärlich ist, löst dies

{"148":"Plane","149":"Car"} 

, die ein Objekt und Objekteigenschaft, um nicht in JS gewährleistet ist.

http://php.net/manual/en/function.json-encode.php

Anmerkung: wenn ein Array codiert, wenn die Schlüssel nicht kontinuierlich von 0 beginnend numerischen Reihenfolge sind, sind alle Tasten als Zeichenfolgen codiert und explizit für jeden Schlüssel-Wert-Paar festgelegt.

Sie können dieses Problem lösen, indem sie ein Array aus dem Objekt zu erzeugen, wie folgt aus:

var obj = <?php echo json_encode($array)?>; // note, eval not needed 
var arr = []; 
Object.keys(obj).forEach(function(key) { 
    arr[key] = obj[key]; 
}); 

bezüglich der Update:

Sie müssen separat die Reihenfolge der Tasten speichern.

var order = <?php echo json_encode(array_keys($array))?>; 
var obj = <?php echo json_encode($array)?>; 
order.forEach(function(key) { 
    console.log(key, obj[key]); // or whatever you need 
}); 

können Sie sogar ein ordered map konstruieren (die Arrays PHP tatsächlich sind, im Gegensatz zu dem Arrays in JS), wenn Sie ES6 oder ein polyfill verwenden.

1

Es gibt zwei Arten von JSON-Datenstrukturen, die Sie hier unterscheiden sollten. Stellen Sie sicher, dass der JSON-Parser Ihre Daten in die gewünschte Struktur einfügt. Ich schlage vor, dass es wahrscheinlich in ein Objekt, nicht ein Array gesetzt wird.

plagiieren direkt von this answer: Von RFC 7159 -Der JavaScript Object Notation (JSON) Data Interchange Format (Hervorhebung von mir):

Ein Objekt ist eine ungeordneten Sammlung von null oder mehr Namen/Wert-Paare , wobei ein Name eine Zeichenfolge und ein Wert eine Zeichenfolge, eine Zahl, ein Boolescher Wert, ein Nullwert, ein Objekt oder ein Array ist.

Ein Array ist eine geordnete Sequenz von null oder mehr Werten.

Die Begriffe "Objekt" und "Array" stammen aus den Konventionen von JavaScript.

und Angebot weiter von this answer:

die Reihenfolge der Elemente in einem Array ([]) gehalten wird. Die Reihenfolge der Elemente (Name: Wert-Paare) in einem "Objekt" ({}) ist nicht, und es ist üblich für sie "durcheinander", wenn nicht durch den JSON-Formatierer/Parser selbst dann durch die sprachspezifischen Objekte (Dictionary , NSDictionary, Hashtable usw.), die als interne Repräsentation verwendet werden.

+0

Vielen Dank Sehnsucht, und gibt es eine Möglichkeit, ein PHP-Array in ein JS-Array zu verwandeln? Denn wenn ich json_encode benutze, wird es in ein Objekt umgewandelt. –

2

Die früheren Plakate haben bereits beantwortet die Frage. Nur um es hinzuzufügen:

Viele Menschen werden verwirrt, weil sie an Javascript Objekte als assoziative Arrays in PHP denken. Das ist jedoch nicht der Fall. Während es richtig ist, dass wir eine Datenstruktur in der Nähe eines assoziativen PHP-Arrays simulieren können (indem sie Objekte in Javascript verwenden), sind sie völlig unterschiedliche Datenstrukturen und funktionieren nicht ganz so wie Arrays.

In Arrays ist die Integrität der Indexposition aus einer Datenstruktur- und Indexbeziehungsperspektive wichtig, weshalb ihre Reihenfolge beibehalten wird. Die gleiche Regel ist jedoch für Objekte nicht relevant, da ihr "Pseudo-Name-Index" (der eigentlich nur der Name der Eigenschaft ist), nicht ortsabhängig ist. Es kann in beliebiger Reihenfolge existieren, solange dieser Eigenschaft immer noch derselbe Wert zugewiesen ist.

Hoffe, das hilft.

Verwandte Themen