2016-12-25 28 views
-1

爲什麼下面的代碼不起作用?我希望用戶選擇兩種選擇之一:「蘋果」或「橙色」,然後表單應該發送選擇所屬的整個數組$ _GET(可以使用$ _POST,但我想看看會發生什麼在查詢字符串中)..
東西沒有什麼打印出來!它只是說「數組」......如果我使用echo來打印發送的數組,也許我會理解,但它應該已經顯示了所選的兩個子數組中的一個。
我剛開始學習PHP的,因此任何詳細的幫助將不勝感激:)發送數組從單選擇使用php

<!DOCTYPE html> 
<html> 
<body> 
<form action="" method="GET"> 
    <?php 
     $fruits=array(
         "a"=>array("name"=>"apple","price"=>130), 
         "b"=>array("name"=>"orange","price"=>100)); 
     //generating a single choice droplist: 
     echo '<select name="tab[]">'; //tab[] because i want to send one of the two arrays a or b 
     echo "<br>"; 
     foreach ($fruits as $key => $value) 
     { 
      echo '<option value="'.$value.'">'.$value['name'].'</option><br>'; 
     } 
     echo "</select>"; 
    ?> 
    <br><br> 
    <input type="submit" value="OK!"> 
    <br> 
</form> 
</body> 
</html> 

<?php 
    print_r($_GET['tab']); //it prints the string "Array", not one of the two sub-arrays a and b 
?> 
+0

您只發送一個值,但發送的值甚至不是數組,它只是一個字符串。 –

+0

感謝您的回覆,請您謹慎解釋一下你的意思是什麼?我不明白? – johnDas

回答

1

看看你的foreach循環中的聲明。

echo '<option value="'.$value.'">'.$value['name'].'</option><br>'; 

$value是一個數組,而不是一個值。這就是爲什麼它會破壞你的HTML。

...我希望用戶選擇的兩個選擇之一:「蘋果」或「橙色」,其後的形式應該發送整個陣列的選擇屬於$_GET

  • <select>元素改爲從echo '<select name="tab[]">';echo '<select name="tab">';
  • 利用http_build_query()從您的陣列生成URL編碼的查詢字符串,並使用該查詢字符串作爲價值屬性。因此,改變你的foreach循環通過以下方式,

    foreach ($fruits as $key => $value){ 
        $output = '<option value="'; 
        $output .= http_build_query($value); 
        $output .= '">'.$value['name'].'</option><br>'; 
        echo $output; 
    } 
    

    和表單提交後,您可以使用parse_str()功能解析$_GET['tab']來獲得原始陣列後面,像這樣:

    parse_str($_GET['tab'], $output); 
    // echo $output['name']; 
    // echo $output['price']; 
    

旁註:如果您想查看完整的超全球結構,請執行var_dump($_GET);

+0

thnx爲了響應,以及我開始明白問題在哪裏,並且我已經嘗試了你的代碼並且它能夠工作,但是,問題出在http_build_query()上,它將所有事情都格式化爲查詢字符串。如果只有一種方法,所以我可以將數組a或b之一傳遞給$ _GET,同時保留數組結構,以便我可以完整地檢索數組而不是字符串 – johnDas

+0

@johnDas我已經完全更新了我的答案。請再次通過答案。 –

+0

非常感謝你! – johnDas

0

變化從'<select name="tab[]">''<select name="tab">' 因爲你只選擇一個項目。當你選擇多個複選框時,你必須設置[](數組唱)。在這種情況下,這是一個下拉菜單,您只能選擇一個選項。無論下拉菜單的價值如何,都無關緊要。它應該是一個數組或單個項目。所以當你只選擇一個值時,你不應該在密鑰中使用數組符號([])。