2016-01-26 22 views
5

Tôi có một ứng dụng trong PHP và JS. Khi tôi EVAL json mã hóa mảng PHP mảng thay đổi sắp xếp. Ví dụ: nếu tôi có một mảng trong PHP như sau:Chức năng js EVAL có thay đổi vị trí của các phần tử không?

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

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

Khi tôi in mảng trong bảng điều khiển, các phần tử không có cùng vị trí. Bạn có biết làm thế nào điều này có thể xảy ra?

CẬP NHẬT

Cảm ơn câu trả lời nhưng tôi muốn giữ trật tự chính xác như nhau trong một cấu trúc JS, vì vậy tôi không muốn đặt hàng mảng bởi một lĩnh vực cụ thể. Có thể thứ tự nhận được từ DB giống như:

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

Tôi muốn tạo một mảng như thế này trong JS theo thứ tự mà nó có (vị trí đến từ DB và nó phải là thứ tự đó). Có thể không?

+0

Bạn không cần eval. 'var array = ;' là đủ. –

Trả lời

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

Kể từ mảng là thưa thớt, điều này giải quyết để

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

đó là một đối tượng và đối tượng để sở hữu không được bảo đảm trong JS.

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

Lưu ý: Khi mã hóa một mảng, nếu các phím không phải là một chuỗi số liên tục bắt đầu từ 0, tất cả các phím được mã hóa như dây đàn, và quy định rõ ràng đối với từng cặp khóa-giá trị.

Bạn có thể giải quyết điều này bằng cách tạo ra một mảng từ đối tượng, như thế này:

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

Liên quan đến việc cập nhật:

Bạn cần phải lưu thứ tự của các phím riêng biệt.

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 
}); 

Bạn thậm chí có thể xây dựng một ordered map (mà mảng PHP thực sự là, không giống như các mảng trong JS) nếu bạn sử dụng ES6 hoặc một polyfill.

1

Có hai loại cấu trúc dữ liệu JSON bạn nên phân biệt ở đây. Đảm bảo rằng trình phân tích cú pháp JSON đang đưa dữ liệu của bạn vào cấu trúc bạn muốn. Tôi khuyên bạn nên đặt nó vào một đối tượng , không phải là một mảng .

đạo văn trực tiếp từ this answer: Từ RFC 7159 -Các JavaScript Object Notation (JSON) Data Interchange Format (tôi nhấn mạnh):

Một đối tượng là một bộ sưu tập có thứ tự của zero hoặc nhiều tên/cặp giá trị , trong đó một tên là một chuỗi và một giá trị là một chuỗi, số, boolean, null, đối tượng hoặc mảng.

Một mảng là đã ra lệnh chuỗi không có hoặc nhiều giá trị.

Thuật ngữ "đối tượng" và "mảng" đến từ các quy ước của JavaScript.

Và tiếp tục trích dẫn từ this answer:

Trình tự các phần tử trong một mảng ([]) được duy trì. Thứ tự của các phần tử (tên: cặp giá trị) trong một "đối tượng" ({}) là không, và thông thường chúng bị "lộn xộn", nếu không phải bởi trình phân tích cú pháp/trình phân tích cú pháp JSON thì đối tượng cụ thể theo ngôn ngữ (Từ điển , NSDictionary, Hashtable, vv) được sử dụng như một biểu diễn bên trong.

+0

Cảm ơn bạn khao khát máy, và có cách nào để biến đổi một mảng PHP thành một mảng JS không? Bởi vì nếu tôi sử dụng json_encode nó được chuyển thành một đối tượng. –

2

Áp phích trước đó đã trả lời câu hỏi. Chỉ cần thêm vào nó:

Nhiều người bị lẫn lộn vì họ nghĩ về các đối tượng Javascript như mảng liên kết trong PHP. Tuy nhiên đó không phải là trường hợp. Mặc dù đúng là chúng ta có thể mô phỏng một cấu trúc dữ liệu gần với một mảng kết hợp PHP bằng cách sử dụng các đối tượng trong Javascript, chúng là các cấu trúc dữ liệu hoàn toàn khác nhau và không hoạt động tương tự như các mảng.

Trong mảng tính toàn vẹn của vị trí chỉ mục quan trọng từ cấu trúc dữ liệu và quan điểm chỉ số quan hệ, đó là lý do tại sao thứ tự của chúng được duy trì. Tuy nhiên, cùng một quy tắc không quan trọng đối với các đối tượng kể từ khi "pseudo-named-index" (thực sự chỉ là tên thuộc tính), không phụ thuộc vào vị trí. Nó có thể tồn tại theo bất kỳ thứ tự nào miễn là thuộc tính đó vẫn có cùng giá trị được gán cho nó.

Hy vọng điều này sẽ hữu ích.

Các vấn đề liên quan