2010-04-02 37 views
6

Giả sử có 5 đầu vào ở dạng webThứ tự dữ liệu trong biểu mẫu bài đăng có giống như trong biểu mẫu web không?

<input name='the_same[]' value='different' /> 
<input name='the_same[]' value='different' /> 
<input name='the_same[]' value='different' /> 
<input name='the_same[]' value='different' /> 
<input name='the_same[]' value='different' /> 

Khi phía máy chủ nhận được dữ liệu bưu điện, tôi sử dụng một foreach để chấp nhận dữ liệu, nói

$the_same = new array(); 
foreach($_POST['the_same'] as $data) 
    $the_same[] = $data; 

sẽ theo thứ tự của dữ liệu lưu trong phía máy chủ giống với nó ở dạng web? và các trình duyệt chéo, nó có thể là tiêu chí mà tất cả các trình duyệt đều theo dõi.

Trả lời

7

Vâng, W3C recommentation on HTML forms không nói:

Việc kiểm soát tên/giá trị được liệt kê trong theo thứ tự chúng xuất hiện trong tài liệu.

Tuy nhiên, tôi muốn xem xét một chút rủi ro để ứng dụng của bạn phụ thuộc rất nhiều vào chi tiết đó.

+0

Vì tôi đã áp dụng hiệu ứng kéo và thả để cho phép người dùng thay đổi thứ tự của các đầu vào này, vì vậy tôi không thể sử dụng chỉ mục. Hoặc tôi nên viết một scipt để reindex các đầu vào khi đăng bài? – Edward

+1

@Relax: um, trong trường hợp đó, tôi nghi ngờ rằng ngay cả văn bản đề xuất W3C cũng không đáng giá, vì giờ nó mở để thông dịch "thứ tự chúng xuất hiện trong tài liệu" nghĩa là tài liệu HTML gốc hoặc DOM hiện tại. Vì vậy, bạn chắc chắn nên cố gắng sử dụng một chỉ mục rõ ràng. Có lẽ bạn có thể bao gồm việc cập nhật chỉ mục trong cơ chế kéo và thả? –

0

Rất có thể, nhưng bạn không nên giả định điều này. Nó phụ thuộc vào trình duyệt của bạn như thế nào các đầu vào đang được gửi đi, và theo truyền thống PHP không đảm bảo rằng một vòng lặp foreach lặp lại theo thứ tự giống như các phần tử đã được thêm vào.

Thực tiễn không tốt là cung cấp cho các đầu vào của bạn cùng tên.

Bạn có thể nối thêm chỉ mục sau mỗi giá trị tên (ngay cả với javascript nếu bạn muốn), và sau đó đọc phần này trong PHP để đảm bảo thứ tự được duy trì.

+0

Xem Dube của trả lời cho một ví dụ tốt về điều này. – Ruud

4

PHP đã xử lý chuyển đổi biến đã đăng hoặc đã nhận thành mảng khi bạn đặt [] sau tên. Làm điều đó thay vì tự mình làm sai.

+1

Có nghĩa là trong ví dụ trên, tôi có thể nhận mảng bằng $ the_same = $ _REQUEST ['the_same']? Làm thế nào về thứ tự dữ liệu trong nó? – Edward

+1

Thứ tự trong mảng sẽ là thứ tự mà trình duyệt web gửi các biến. Nói chung chúng là từ đầu đến cuối từ nút 'form' có liên quan. –

1

Cách tốt hơn để làm trong html:

<input name='the_same[]' value='different' /> 

Sau đó, trong server:

$the_same = new array(); 
foreach($_POST['the_same'] as $data) // or $_GET if you prefer 
    $the_same[] = $data; 

Bằng cách này không có biến sẽ ghi đè.

1

nếu bạn muốn có nó trong một trật tự, bạn có thể sử dụng các biến động hoặc đơn giản là truy cập vào các mảng rõ ràng

the_same1 the_same2 the_same3

kể từ khi bạn biết tên dù sao, bạn có thể truy cập chúng dễ dàng

$the_same = array(); 
for($i=1; ; $i++){ 
    $tmp =$_REQUEST["the_same".$i] 
    if(empty($tmp)){ 
      // no more stuff 
      break; 
    } 
    $the_same[] = $tmp; 
} 
+0

Nhưng tôi đã áp dụng hiệu ứng kéo và thả để cho phép người dùng thay đổi thứ tự đầu vào, do đó the_same3 có thể là $ the_same [0] – Edward

1

Nếu bạn thay đổi tên của đầu vào của bạn để the_same[]-$_REQUEST['the_same'] sẽ trở thành một mảng của những giá trị, đầu đến cuối theo thứ tự nguyên tố (tất cả các trình duyệt hiện tại tôi tin).

Bạn cũng có thể chỉ định một thứ tự cụ thể nếu cần hoặc thậm chí sử dụng các phím chuỗi. Ví dụ, một <input name='the_same[apple][2]'/> sẽ trở thành $_REQUEST['the_same']['apple'][2]

Nếu không sử dụng [] vào tên đầu vào, PHP sẽ chỉ nhìn thấy giá trị ngoái.Các giá trị khác sẽ được 'ghi đè' bằng giá trị sau này khi các mảng $_REQUEST/$_GET/$_POST được tạo.

Một ví dụ của việc sử dụng đó để lợi thế của bạn có thể là với một ô trống, như hộp kiểm HTML chỉ nộp một giá trị khi kiểm tra, bạn có thể muốn gửi một "không được chọn" giá trị somtime:

<input type='hidden' name='check' value='not checked' /> 
<input type='checkbox' name='check' value='checked' /> 
Các vấn đề liên quan