2011-01-04 5 views
3

私はこの関数をどのように書くべきかについてひどく混乱しています...それは基本的にテストを評価し、1人のユーザーの値で動作します。PHPのアサーションと配列

次のユーザーの値を入力したいとしましょう:$id = 2 ...これが動作します! $id = array(2,3,4,5)それが動作しない場合!

function get_score_a($id){ 
    // Case 4 
    foreach($this->get_results_a($id,4)->row() as $key=>$a){ 
     if ($a >= 2 && $a <= 4) { 
      $score_a += 2; 
     } else if ($a > 4 && $a < 8) { 
      $score_a += 3; 
     } else if ($a > 8) { 
      $score_a += floor($a - 8) * .5; 
      $score_a += 3; 
     } 
    }; 

    return $score_a; 
} 


function get_results_a($id, $method) { 
     $select_cols = array(
          1 => array('a_1','a_2','a_4'), 
          2 => array('a_6','a_8','a_11','a_12','a_14'), 
          3 => array('a_3','a_10'), 
          4 => array('a_5','a_7','a_9','a_13') 
          ); 
     return $this->db->select($select_cols[$method]) 
         ->where_in('id', $id) 
         ->get('be_survey'); 
    } 

これは私が複数のIDを実行した場合、スコアは...しかし、...それはちょうど私が思うに、すべての数字を足し返す...

代わりに、私は、出力の別々のスコアにこれを必要とします個々のユーザー...

私は合計のnoobだと注目されるかもしれません!だからこやかな説明は非常に感謝しています。 :)

編集してください...私はもっと明確にすべきでした!ごめんなさい! 私はお詫び申し上げます! 合計で

に基づいてテーブルから正しい値を選択します。はい、私の目にも痛いです! 私はあまりにも急いでいます!これはCodeigniterプロジェクトです!

+4

Aargh!私の目! – fredley

+1

"これはスコアを返します。"いいえ、それはありません。最初の行に解析エラーが返されます。 – webbiedave

+0

CodeIgniterのPHPフレームワークを使用していますか?なぜあなたは '$ this'を使用していますか? – Stoic

答えて

4

まず、foreachループの$ score_bは、その前の値と、各実行時にインクリメントされている内だけで、第二にforeach ($array as $key=>$value)
を使用...配列のためのrow()はありません。したがって、あなたのコードはすべてのプレーヤーの得点の合計を出力しています。
使用:

foreach(array(5,5,5,6,7,78,8,7,7,6,5) as $key=>$a){ 
     if ($a >= 0 && $a <= .5) { 
      $score_b[$key] += 0; 
     } else if ($a > .5 && $a < 2) { 
      $score_b[$key] += 1; 
     } 
    else if ($a > 2 && $a < 4) { 
      $score_b[$key] += 2; 
     } 
      else if ($a > 4) { 
      $score_b[$key] += floor($a - 8) * .5; 
      $score_b[$key] += 2; 
     } 
    }; 

の$ score_bは現在、スコアの配列になります。

EDIT: はあなたのコードに次のように追加します。

$id = array(2,3,4,5); 
function get_score_array($ids) { 
    foreach ($ids as $id) { 
     $scores[$id] = get_score_a($id); 
    } 
    return $scores; 
} 

$scoresは今$id =>$scoreペアの配列となります。
また、(私はあなたが使用している推測する)あなたの枠組みに従って、上記のコードを調整

+0

私の編集を見てください!ごめんなさい! :)これがまだ解決策であれば、これをhtmlで出力/フォーマットする方法も含めるでしょうか?再び、私は完全な騒ぎです! –

+0

非常に良い解決策、Stoic。これは動作します! –

+0

あなたが答えることができるなら、私は感謝します:) – Stoic

2

row()と呼ばれる方法はarrayにありません。実際、arrayは厳密にはオブジェクトではないため、メソッドはありません。

まず、->row()の呼び出しを取り除いてください。

次に、これらのスコアをどこに配列にプッシュしますか?私はあなたのコードでそれがどこに起こるかわかりません。 foreachループの前に空の配列を初期化し、$score_b変数をループの最後の配列にプッシュします。

+0

彼は 'foreach'ループ内で同じ' score_b'変数をインクリメントしているので、個々のスコアではなくすべてのプレイヤースコアの合計を出力しているので、動作しません。 – Stoic

+0

@Stoic私は少し前に私の答えを編集しました。 –

+0

@Stoic問題ありません! :) –

0

このようなforeachループの外$userID変数に設定します。

$userScores = array(
    'bobby' = > array(5,5,5,6,7,78,8,7,7,6,5), 
    'sue' = > array(5,5,5,6,7,78,8,7,7,6,5), 
    'joe' = > array(5,5,5,6,7,78,8,7,7,6,5) 
); 

foreach($userScores as $name => $a){ 
    $score_b[$name] = 0; //initialize 
    if ($a >= 0 && $a <= .5) { 
     $score_b[$name] += 0; 
    } else if ($a > .5 && $a < 2) { 
    $score_b[$name] += 1; 
    } 
else if ($a > 2 && $a < 4) { 
     $score_b[$name] += 2; 
    } 
     else if ($a > 4) { 
     $score_b[$name] += floor($a - 8) * .5; 
     $score_b[$name] += 2; 
    } 
}; 

をあなたの最終的な結果は次のようなものでなければなりません(私は実際の数学をしていませんでした)

$score_b['bobby'][100] 
$score_b['sue'][75] 
$score_b['joe'[90] 
+0

私はこれの外観が好きです、JMC ...私はこれを試してみましょう! –

+0

私は '未定義インデックス:bobby'を取得しています... –

+0

' + = '演算子を使う前に' $ score_b [$ name] '変数を初期化する必要がありますか?それが問題ならば、 'foreach'の直後に' score_b [$ name] = 0; 'を追加してみてください – JakeParis