Сравнение перебираемых элементов массива

Рейтинг: 2Ответов: 1Опубликовано: 05.05.2015

Существует таблица с сотрудниками. По каждому сотруднику есть несколько строк.

Таблица выводится в цикле while. Как мне сделать так, чтобы происходило сравнение предыдущего значения элемента массива с последующим. В случае пока значения совпадают (Иванов == Иванов), то делать определенные арифметические операции. Если не совпадают (Иванов == Дмитриев), то выводить переменную с результатом, и заново начинать те же действия только уже для значения (Дмитриев). Ну и т.д.

Попытался сделать так:

$db = mysql_query("SELECT * FROM itog");
$mas = mysql_fetch_assoc($db);
$fio = $mas['fio'];
while($mas = mysql_fetch_assoc($db)){
    if($fio == $mas['fio']){
        $fio = $mas['fio'];
        //Всякие вычисления результат которых попадет в переменную $result  
    }
    else {
        $result = 0;
        $fio = $mas['fio'];
        //Всякие вычисления результат которых попадет в переменную $result 
    }
}

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

Ответы

▲ 1
  1. Проверять совпадение по ФИО - плохо, надо по id.
  2. Это надо делать не в цикле, а в sql-запросе (group by и соответствующие аггрегирующие функции).
  3. Не надо делать fetch до цикла, а в начальное значение лучше присвоить какой-нибудь null, чтобы после первого вытаскивания сработала вторая ветвь.
  4. Не забыть обработать строку в else-ветке. Или убрать if с ==, а соответствующие действия делать это после проверки на != (то, что сейчас в else-ветке), но без всяких else.
  5. Не забыть вывести результат после цикла.

Вместо 4-5 можно сделать вечный цикл с вытаскиванием и break в середине.


Если Вас не затруднит, не могли бы Вы видоизменить мой алгоритм, и показать наглядно пожалуйста.

Алгоритм я изменить могу приблизительно (т. к. php не знаю), но дальше сам разберёшься, наверное. В любом случае, так делать нехорошо, правильно было бы переместить всю эту логику внутрь sql-запроса.

Просто для информации привожу алгоритм с минимальным дублированием кода:

// Я предполагаю, что одному id гарантированно соответствуют одинаковые fio
$db = mysql_query("SELECT * FROM itog ORDER BY fio, id");

while (true) {
    if (!($mas = mysql_fetch_assoc($db)) || $id !== $mas['id']) {
        ВыводЧегоТо();

        if (!$mas) {
            break;
        }

        $id = $mas['id'];
        $result = 0;
        ДругиеОбнуления();
    }

    ВсякиеВычисленияРезультатКоторыхПопадетВПеременнуюResult();
}