Foreach и массивы в PHP - PullRequest
       1

Foreach и массивы в PHP

3 голосов
/ 05 января 2011

Я ужасно смущен тем, как я должен писать эту функцию ... она в основном оценивает тест и работает для значений одного пользователя.

Допустим, я хочу значения для следующего пользователя: $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');
    }

Это возвращает счет ... однако, если я запускаю несколько идентификаторов ... это просто складывает все числа, я думаю ...

Вместо этого мне нужно выводить отдельные оценки для отдельных пользователей ...

Можно заметить, что я полный нуб! Так что живые объяснения очень ценятся. :)

Редактировать Пожалуйста, просмотрите мой код ... как я должен был быть более ясным! Сожалею! Приношу извинения! Суммируя, выбирает правильные значения из таблицы на основе

И да, у меня тоже болят глаза! Редактировать Я слишком поспешен! Это проект Codeigniter!

Ответы [ 3 ]

4 голосов
/ 05 января 2011

Во-первых, нет row() для массивов .. просто используйте foreach ($array as $key=>$value)
Во-вторых, внутри цикла foreach $ score_b увеличивается при каждом запуске с его предыдущим значением. Итак, ваш код выводит сумму всех очков игрока.
Применение:

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 пар.
Кроме того, настройте приведенный выше код в соответствии с вашей платформой (которую, я думаю, вы используете)

2 голосов
/ 05 января 2011

Нет такого метода, который называется row() на array. На самом деле array не является строго объектом , поэтому у него нет методов.

Итак, прежде всего, избавьтесь от вызова ->row().

Во-вторых, куда вы помещаете эти оценки в массив? Я не вижу, где это происходит в вашем коде. Инициализируйте пустой массив перед циклом foreach и поместите переменную $score_b в массив в конце цикла.

0 голосов
/ 05 января 2011

Установите переменную $userID вне цикла foreach следующим образом:

$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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...