2010-04-02 66 views
6

假設有網狀形式的5個輸入數據訂單在郵政形式與網絡形式相同嗎?

<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' /> 

當服務器端接收後的數據,我使用foreach接受數據,說

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

將數據的順序保存在服務器端在網絡形式是相同的嗎?和跨瀏覽器,它可能是所有瀏覽器遵循的標準。

回答

7

好了,W3C recommentation on HTML forms確實說:

名稱/值在 它們在文檔中出現的順序列出的控制。

不過,我認爲讓您的應用程序嚴格依賴該細節會有點危險。

+0

因爲我應用了拖放效果以讓用戶更改這些輸入的順序,所以我無法使用索引。或者,我應該寫另一個scipt重新索引這些輸入時發佈? – Edward 2010-04-02 09:48:16

+1

@Relax:恩,在這種情況下,我懷疑即使是W3C推薦文本也沒有任何價值,因爲它現在可以解釋「它們在文檔中出現的順序」是指原始HTML文檔還是當前DOM。所以你一定要嘗試使用明確的索引。也許你可以在拖放機制中包含索引更新? – 2010-04-02 10:11:25

0

很可能是的,但你不應該假設這一點。這取決於您的瀏覽器如何發送輸入,並且PHP不能保證foreach循環以與添加元素相同的順序進行迭代。

給你的輸入命名是一個不好的做法。

您可以在每個名稱值之後附加索引(即使使用javascript,如果需要),然後在PHP中閱讀以確保訂單得到維護。

+0

見杜貝的回答一個很好的例子。 – Ruud 2010-04-02 09:49:33

4

當您在名稱後面加上[]時,PHP已經處理將POSTed/GETed變量轉換爲數組。這樣做,而不是自己搞錯了。

+1

這是否意味着在上面的例子中,我可以通過$ the_same = $ _REQUEST ['the_same']獲取數組?數據順序如何呢? – Edward 2010-04-02 09:41:02

+1

數組中的順序將是Web瀏覽器發送變量的順序。通常,它們是相關「form」節點的首位。 – 2010-04-02 09:42:25

1

更好的辦法在HTML做:

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

然後在服務器:

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

這樣沒有變量會覆蓋。

1

,如果你想擁有它的順序,您可以使用動態變量或簡單地訪問數組明確

the_same1 the_same2 the_same3

因爲你反正知道這個名字,你可以訪問它們易

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

但我應用拖放效果讓用戶更改輸入順序,因此the_same3可能是$ the_same [0] – Edward 2010-04-02 09:56:01

1

如果你改變你的輸入the_same[]的名字 - $_REQUEST['the_same']將成爲這些值的數組,第一個到最後元素的次序(全我相信目前的瀏覽器)。

如果需要,還可以指定特定的順序,甚至可以使用字符串鍵。舉例來說,一個<input name='the_same[apple][2]'/>將成爲$_REQUEST['the_same']['apple'][2]

不使用輸入名稱[],PHP將只能看到最後值。當構建數組時,其他值將由後面的值'覆蓋'。

使用的一個例子,你的優勢可能是一個複選框,爲選中當HTML複選框只提交一個值,你可能希望提交一個「未選中」值somtime:

<input type='hidden' name='check' value='not checked' /> 
<input type='checkbox' name='check' value='checked' />