2013-01-17 118 views
3

嘗試創建GPA計算器。我有一個提交給php文件的表單,然後將表單中的所有數據存儲在一個php數組()中。該計算器很好,直到我輸入相同的值。我認爲這不會有意義,直到我展示一些圖片:foreach()跳過數組中的第一個元素

這裏是一個圖像中的問題:

Error Scenario

Correct Scenario

所以第一個圖像在我進入一個A,然後另一在第二個圖像中,var_dump()是數組(2){[0] => float(4),它使用var_dump()輸出數組{1} {[0] => float(4.5)}。 )1 => float(3.5)}

它正在跳過第一張圖片的第一行......只是在A情況下,REG應該等於4.0,在HONORS應該等於4.5。這可能是array_combine()

這裏是我的PHP代碼:

//$_POST['grades'] for the grades <option> and $_POST['types'] for the type (REG, HONORS) 
foreach(array_combine($_POST['grades'], $_POST['types']) as $code => $count) 
{ 

    if ($code == "A") 
    { 
     if ($count == "REGULAR") 
     { 
      $GradeArray[] = 4.0; 
     } 
     else if ($count == "HONORS") 
     { 
      $GradeArray[] = 4.5; 
     } 
     else if ($count == "COLLEGE") 
     { 
      $GradeArray[] = 5.0; 
     } 
    } 
    else if ($code == "B") 
    { 
     if ($count == "REGULAR") 
     { 
      $GradeArray[] = 3.0; 
     } 
     else if ($count == "HONORS") 
     { 
      $GradeArray[] = 3.5; 
     } 
     else if ($count == "COLLEGE") 
     { 
      $GradeArray[] = 4.0; 
     } 
    } 
    else if ($code == "C") 
    { 
     if ($count == "REGULAR") 
     { 
      $GradeArray[] = 2.0; 
     } 
     else if ($count == "HONORS") 
     { 
      $GradeArray[] = 2.5; 
     } 
     else if ($count == "COLLEGE") 
     { 
      $GradeArray[] = 3.0; 
     } 
    } 
    else if ($code == "D") 
    { 
     if ($count == "REGULAR") 
     { 
      $GradeArray[] = 1.0; 
     } 
     else if ($count == "HONORS") 
     { 
      $GradeArray[] = 1.5; 
     } 
     else if ($count == "COLLEGE") 
     { 
      $GradeArray[] = 2.0; 
     } 
    } 
    else if ($code == "F") 
    { 
     if ($count == "REGULAR") 
     { 
      $GradeArray[] = 0.0; 
     } 
     else if ($count == "HONORS") 
     { 
      $GradeArray[] = .5; 
     } 
     else if ($count == "COLLEGE") 
     { 
      $GradeArray[] = 1.0; 
     } 
    } 


} 

這可能是需要重做整個的foreach()語句...我最多再編寫邏輯,如果有人說所以...

我不想用代碼堵塞問題,所以如果你絕對需要html,只需要問一下,我會添加一個編輯。

編輯:我也想我需要重寫邏輯......我從來沒有使用array_combine()之前......我只是需要確保與相關

感謝您的幫助的對應!

+0

也許$ _POST'的轉儲會有幫助。 –

+0

我認爲數組合是probs。,第一個aray可能包含相同的等級,因此它將被丟棄。 –

+0

嘗試得到數組(5){[0] => string(1)「A」[1] => string(1)「A」[2] => string(1)「0」[3] =>字符串(1)「0」[4] =>字符串(1)「0」} for'grades []'和array(5){[0] => string(7)「REGULAR」[1] => string (7)「REGULAR」[2] => string(1)「0」[3] => string(1)「0」[4] => string(1)「0」}' –

回答

1

看看這個陣列和輸出用查找「一」成爲所得陣列的鍵的值 所以如果u希望全陣列與第一陣列的密鑰進行組合,然後第一陣列必須卡瓦唯一值。

<?php 
    print_r(array_combine(Array('a','a','b'), Array(1,2,3))); 
    ?> 
    Returns: 
    Array 
    (
     [a] => 2 
     [b] => 3 
    ) 

解決方案(可能不是最好的)

foreach($_POST['grades'] as $KEY=>$code) 
{ 
    $count = $_POST['types'][$KEY]; 
    if ($code == "A") 
    { 
     if ($count == "REGULAR") 
     { 
      $GradeArray[] = 4.0; 
     } 
     else if ($count == "HONORS") 
     { 
      $GradeArray[] = 4.5; 
     } 
     else if ($count == "COLLEGE") 
     { 
      $GradeArray[] = 5.0; 
     } 
    } 
    else if ($code == "B") 
    { 
     if ($count == "REGULAR") 
     { 
      $GradeArray[] = 3.0; 
     } 
     else if ($count == "HONORS") 
     { 
      $GradeArray[] = 3.5; 
     } 
     else if ($count == "COLLEGE") 
     { 
      $GradeArray[] = 4.0; 
     } 
    } 
    else if ($code == "C") 
    { 
     if ($count == "REGULAR") 
     { 
      $GradeArray[] = 2.0; 
     } 
     else if ($count == "HONORS") 
     { 
      $GradeArray[] = 2.5; 
     } 
     else if ($count == "COLLEGE") 
     { 
      $GradeArray[] = 3.0; 
     } 
    } 
    else if ($code == "D") 
    { 
     if ($count == "REGULAR") 
     { 
      $GradeArray[] = 1.0; 
     } 
     else if ($count == "HONORS") 
     { 
      $GradeArray[] = 1.5; 
     } 
     else if ($count == "COLLEGE") 
     { 
      $GradeArray[] = 2.0; 
     } 
    } 
    else if ($code == "F") 
    { 
     if ($count == "REGULAR") 
     { 
      $GradeArray[] = 0.0; 
     } 
     else if ($count == "HONORS") 
     { 
      $GradeArray[] = .5; 
     } 
     else if ($count == "COLLEGE") 
     { 
      $GradeArray[] = 1.0; 
     } 
    } 

} 
+0

所以我猜測不要使用array_combine()...我應該如何解決這個問題? –

+1

-1。笛卡爾產品肯定會給出錯誤的結果。 –

+0

@Jack編輯,將這項工作? –

3

如果要遍歷兩個陣列(或更多),你可以考慮使用MultipleIterator;它不會像array_combine()這樣的clobber數組鍵。

您還可以通過使用一個數組來定義每個等級/類型組合的得分簡化你的邏輯:

$gradesToScores = array(
    'REGULAR' => array(
    'A' => 4.0, 'B' => 3.0, 'C' => 2.0, 'D' => 1.0, 'F' => 0.0, 
), 
    'HONORS' => array(
    'A' => 4.5, 'B' => 3.5, 'C' => 2.5, 'D' => 1.5, 'F' => 0.5, 
), 
    'COLLEGE' => array(
    'A' => 5.0, 'B' => 4.0, 'C' => 3.0, 'D' => 2.0, 'F' => 1.0, 
), 
); 

$gradeItemIterator = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC); 
$gradeItemIterator->attachIterator(new ArrayIterator($_POST['grades']), 'grade'); 
$gradeItemIterator->attachIterator(new ArrayIterator($_POST['types']), 'type'); 

$gradeScores = array(); 

foreach ($gradeItemIterator as $gradeItem) { 
    $gradeScores[] = $gradesToScores[$gradeItem['type']][$gradeItem['grade']]; 
} 
+0

我從來沒有這樣做過,但它看起來更好......我試過它,並在$ gradeScores []上使用var轉儲,但在var_dump()中獲得NULL值 –

+0

@cipherous實現我忘了給構造函數添加一個標誌;它現在應該工作。 –

1

我與阿倫對行爲的原因達成一致。一種可能的解決辦法是:

$lookup = Array("A"=>4, "B"=>3, "C"=>2, "D"=>1, "F"=>0); 

for ($i=0; $i<count($_POST['grades']); $i++) { 
    $temp = $lookup[ $_POST['grades'][$i] ]; 
    if ($_POST['types'][$i] == "HONORS") { 
     $temp += .5; 
    } 
    elseif ($_POST['types'][$i] == "COLLEGE") { 
     $temp += 1; 
    } 
    $GradeArray[] = $temp; 
} 

這假定的$_POST['grades']$_POST['types']計數等於 - 否則它要麼導致undefined offset通知或沒有解決的每個值。


關於Arun的代碼:嵌套的兩個循環將創建N * M個內循環迭代 - 一個級/類型的每個組合,顯然是錯誤在這種情況下!我們需要並行地通過 陣列,因爲它們用於保存配對值。


@Jack:如果我沒有記錯的話,你需要換 HONORSCOLLEGE在你的數組定義。

+0

如果你想留下其他答案的評論,你應該使用「添加評論」功能,而不是更新你的答案:) –

+0

@傑克他沒有足夠的代表(50特權)... –

+0

@NullPointer這應該是現在解決:) –

相關問題