2014-02-13 39 views
1

我是相當新的PHP,所以請與我裸...複選框陣列相比其他陣列(PHP)

我有幾個複選框的頁面。您可以進行任意組合的選擇。

<form action="result.php" method="post"> 
    <p> 
     <label> 
      <input type="checkbox" name="CheckboxGroup1[]" value="choice" id="choice"> 
      option 1 
     </label> 
     <br> 
     <label> 
      <input type="checkbox" name="CheckboxGroup1[]" value="range-all" id="range-all"> 
      option 2 
     </label> 
     <br> 
     <label> 
      <input type="checkbox" name="CheckboxGroup1[]" value="range-two" id="range-two"> 
      option 3 
     </label> 
     <br> 
     <label> 
      <input type="checkbox" name="CheckboxGroup1[]" value="range-two" id="range-two"> 
      option 4 
     </label> 
     <br> 
     <label> 
      <input type="checkbox" name="CheckboxGroup1[]" value="range-other-two" id="range-other-two"> 
      option 5 
     </label> 
     <br> 

    </p> 
    <p> 
     <input type="submit"> 
    </p> 
</form> 

提交您的選擇後,表單將帶您進入下一頁,在該頁面中將複選框選擇陣列與預定義的選項陣列進行比較。

<?php 

    $options = array("choice", "range-all", "range-two", "range-other-two"); 
    $checkboxes = $_POST['CheckboxGroup1']; 
    $intersection = array_intersect($options, $checkboxes); 
    $results = print_r($intersection, true); 

    //these are various scenarios based on what the user could choose 
    $scen1var = array("choice", "range-all"); 
    $scen1 = print_r($scen1var, true); 

    $scen2var = array("choice", "range-two"); 
    $scen2 = print_r($scen2var, true); 

    $scen3var = array("choice", "range-other-two"); 
    $scen3 = print_r($scen3var, true); 

    $scen4var = array("range-all", "range-other-two"); 
    $scen4 = print_r($scen4var, true); 

    if ($results === $scen1) { 
     echo "choice and range all"; 
    } 
    elseif ($results === $scen2) { 
     echo "range consumables and range both"; 
    } 
    //The elseif's carry on in this manner 
    else { 
     echo "something else"; 
    } 

?> 

我現在有一個問題,現在第一個「if語句」的作品,但elseif沒有。另外,如果我更改第一個「if語句」以將$ results與其他任何$ scen比較,即。 $ scen2,$ scen3,它不起作用,只是跳轉到「其他」部分。

我有一種感覺,我不是做的意義,所以請讓我知道,如果我能詳細解釋多一點...

而且這種方式我這樣做似乎有點過分。當然有一個更簡單的方法?

任何幫助將非常感激!

感謝, 帕特里克

+0

爲什麼使用'print_r()'進行比較?你可以比較兩個數組''array_1 === $ array_2',不是嗎? – amsross

回答

0

問題是,array_intersect不保留數組的關鍵。

<?php 

$array1 = array(2, 4, 6, 8, 10, 12); 
$array2 = array(1, 2, 3, 4, 5, 6); 

var_dump(array_intersect($array1, $array2)); 
var_dump(array_intersect($array2, $array1)); 

?> 

產生如下:

array(3) { 
    [0]=> int(2) 
    [1]=> int(4) 
    [2]=> int(6) 
} 

array(3) { 
    [1]=> int(2) 
    [3]=> int(4) 
    [5]=> int(6) 
} 

你將不得不更換

$scen1var = array("choice", "range-all"); 
$scen2var = array("choice", "range-two"); 
$scen3var = array("choice", "range-other-two"); 
$scen4var = array("range-all", "range-other-two"); 

$scen1var = array(1=>"choice", 2=>"range-all"); 
$scen2var = array(1=>"choice", 3=>"range-two"); 
$scen3var = array(1=>"choice", 4=>"range-other-two"); 
$scen4var = array(2=>"range-all", 4=>"range-other-two"); 

我強烈建議你改變你的方法解決這個問題,因爲這也許不會 是因爲它似乎可靠..

這是我的建議:

$checkboxes = $_POST['CheckboxGroup1']; 
if(count($checkboxes) == 2 && 
    in_array('choice', $checkboxes) && 
    in_array('range-all', $checkboxes) 
){ 
    // choice and range only 
} 
// etc. 

當然,有很多的方式做這種東西。另一種方法。

$choice = false; 
$range_all = false; 
$range_two = false; 
$range_other_two = false; 
foreach($_POST['CheckboxGroup1'] as $checkbox) 
{ 
    if($checkbox == 'choice') 
    { 
     $choice = true; 
    } 
    elseif($checkbox == 'range_all') 
    { 
     $range_all = true; 
    } 
    //etc 
} 

if($choice && $range_all && !$range_two && !$range_other_two) 
{ 
    // choice and range_all only. 
} 
// etc. 
+0

嗨尼科,感謝您的快速回復。我會改變並讓你知道... 你認爲你可以建議任何其他方法來研究我嗎? 非常感謝! – paddy1228

+0

@ user3306818看我的編輯 – Nico

+0

非常感謝。這似乎對我有意義。我會試一下! 再次感謝! – paddy1228

0

你的數組索引斷開。

添加這上面你if/else塊:print_r($results);

你會看到,選擇choicerange-two輸出Array ([0] => choice [2] => range-two)而不是Array ([0] => choice [1] => range-two),這是什麼$scen2等於。

+0

感謝您的支持!說得通! – paddy1228