2010-04-22 26 views
5

Trong PHP tôi đang chạy một mysql_query có mệnh đề ORDER BY. Tôi sau đó lặp qua các kết quả để xây dựng một mảng kết hợp, với row_id là khóa.Thứ tự của mảng liên kết của tôi có được duy trì từ PHP sang Javascript không?

Sau đó, tôi đang gọi json_encode trên mảng đó và xuất kết quả.

Trang này được tải bằng AJAX và được xác định trong biến Javascript. Khi tôi lặp qua biến Javascript đó, tôi vẫn có thứ tự được trả về từ mysql_query chưa?

Trả lời

5

Cletus nói là chính xác, nhưng theo kinh nghiệm của tôi, hầu hết các trình duyệt sẽ duy trì thứ tự. Điều đó đang được nói, bạn nên cân nhắc sử dụng một số Array. Nếu bạn cần phải sắp xếp nó một khi bạn nhận được nó trên client-side, chỉ cần sử dụng .sort() hàm trong JavaScript:

rows.sort(function(a, b) { 
    return a.row_id - b.row_id; 
} 

Mặc dù nó có vẻ như nó hoạt động, thứ tự của các thuộc tính trong một đối tượng không thể được tính trên. Xem nhiều ý kiến ​​dưới đây để biết thêm thông tin (mắt thông minh hơn tôi). Tuy nhiên, đây là đoạn code tôi sử dụng để kiểm tra các hành vi trong thử nghiệm hạn chế của riêng tôi:

var test = { 
    one: 'blah', 
    two: 'foo', 
    another: 'bar' 
}; 

for (prop in test) { 
    document.write(prop + "<br />"); 
} 

Prints (trong Firefox 3.6.3 và 5.0.375.9 Chrome):

one 
two 
another 

Ngoài ra, bạn có thể muốn chắc chắn rằng bạn đang nhận được loại mã hóa JSON bạn cần quay trở lại từ json_encode(), chẳng hạn như một đối tượng (sử dụng các dấu ngoặc nhọn {}) và không phải là mảng ([] dấu ngoặc ôm). Bạn có thể cần phải vượt qua JSON_FORCE_OBJECT đến json_encode() để ép buộc.

  • Edited để làm rõ rằng cách tiếp cận Array là ưa thích)
  • Edited một lần nữa (xin lỗi), như tôi đã bỏ qua lời nhận xét của pcorcoran, trong đó có một liên kết đến một vấn đề trong theo dõi vấn đề của Chromium về vấn đề này. Đủ để nói, thứ tự các thuộc tính của đối tượng là không phải là đáng tin cậy.
+0

Đã thất bại trên Opera và Chrome, và hành vi ở nơi khác có thể thay đổi khi các công cụ JS tiếp tục được tối ưu hóa. Đừng dựa vào thứ tự Object: đi cho Array. – bobince

+0

Dường như nó hoạt động với tôi trong Chrome (5.0.375.9 trên Mac OS X) - bạn đang sử dụng một phiên bản khác hay bạn có một đoạn mã có thể khiến Chrome bỏ qua thứ tự? Tôi hầu như chỉ quan tâm đến quan điểm tò mò. Tôi đồng ý với bạn-- cách tiếp cận tốt nhất là sử dụng một mảng và '.sort()' nếu cần. – awgy

+0

Nevermind-- đã bỏ qua nhận xét của pcorcoran bên dưới, liên kết với trình theo dõi vấn đề Chromium. – awgy

11

Mảng PHP có phần duy nhất trong thuộc tính duy trì thứ tự chèn của chúng. Javascript không có mảng kết hợp mỗi lần. Nó có các đối tượng, thường được sử dụng như các mảng kết hợp. Những điều này không đảm bảo bất kỳ thứ tự khóa cụ thể nào.

Tại sao không xuất chúng dưới dạng mảng? Điều đó sẽ có một thứ tự cụ thể. Nếu bạn muốn một số loại tra cứu quan trọng tại sao thứ tự quan trọng?

+1

Tôi nghĩ rằng cuối cùng tôi đã kiểm tra, ecma spec cho biết nó không có thứ tự, nhưng tất cả các trình duyệt đã triển khai chúng khi được đặt hàng. – goat

+3

Tất cả các trình duyệt được sử dụng để triển khai mảng liên kết đối tượng theo thứ tự theo độ tuổi. Chrome hiện là ngoại lệ. Và vì ECMA cũng nói rằng đơn đặt hàng không cần phải được bảo quản, tốt nhất là không nên dựa vào đơn đặt hàng. Xem: http://code.google.com/p/chromium/issues/detail?id=883 để thảo luận lại: Chrome. – pcorcoran

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