За последние 24 часа нас посетили 31018 программистов и 1450 роботов. Сейчас ищет 881 программист ...

Проблема с in_array()

Тема в разделе "Прочие вопросы по PHP", создана пользователем Zuldek, 6 июн 2014.

  1. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Заголовок темы выбрал чтобы людям легче было найти эту досадную ошибку.

    Ошибку помог найти мой более опытный в PHP коллега, сам бы искал дольше.
    В сценарии обработки xml-документов (на самом деле не принципиально где)
    используется такая (примерно) конструкция:
    Код (Text):
    1.         if(in_array('error', $some_array)) {
    2.             continue;
    3.         }
    Дальше, как опытные пхпшеры, вероятно, уже догадались, сценарий всё время переходил к следующей итерации цикла.
    Класс отвечающий за логирование работы сценария отдавал в логе примерно следующее:
    "В документе 2000 элементов". Далее, где обычно идёт лог обнаруженных ошибок, сразу вышли записи лога: "Ошибок 0 Сохранено элементов 0".
    Никаких ошибок памяти или иных fatal-ероров или варнингов. Сценарий отработал правильно.
    Уже проанализировав сценарий и найдя источник проблемы (он в коде выше), вопрос к обучающимся читателям форума:
    Почему цикл переходит к следующей итерации если в массиве $some_array нет ключа или значения содержащего 'error' ?
    Уточню: задача не в том, чтобы указать что нужно исправить чтобы перехода к следующей итерации не возникало, а именно объяснить почему он произошёл.
    Как и всегда в программировании на любом языке, ошибка и решение элементарные, но дабы ей "отомстить" за потраченное время, решил лишний раз запостить и напомнить коллегам.
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Код (Text):
    1. for ($i = 0; $i<9000; $i++){
    2. if(in_array('error', $some_array)) {
    3.             continue;
    4.         }
    5. }
    Действительно, ПОЧЕМУ произошел переход к следующей итерации?

    Код (Text):
    1. for ($i = 0; $i<9000; $i++){
    2. echo 'УХАХА';
    3. }
    Чертов цикл! Оно опять это делает! Оно опять выполняет итерацию за итерацией!

    Покажи фрагмент кода нормально. А то получается "доктор, у меня что-то болело, объясните, почему?"

    З.Ы. Только не говори что мой сарказм был в тему и я угадал.
     
  3. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Неа, Суррикат, ты не прав. Тут мы видим одно из проявлений Великой ПХПшной Грабли. Думай дальше )
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Неужто из-за непроставленного стрикта оно срабатывало на всем подряд? Это правда подло и как-то глупо, не?
     
  5. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Блин. Вот зачем ты убил всю интригу? )
     
  6. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    И так понятно что дело в третьем параметре.
    А цикл показывать нет смысла, потому что срабатывание условия перехода к следующей итерации при описанных мной условиях могло быть только в одном случае (ибо указал, что ни ключи ни значения массива не содержат 'error').
    Цикл заносит на каждой итерации разные элементы в массив.
    После показа возможного содержимого массива, причина ошибки уже очевидна:
    Код (Text):
    1. $some_array = array(0=>'value1','title'=>'value2','desc'=>0);
    Ирония это конечно хорошо. Ошибка противная тем не менее и выявляется анализом кода разумеется более сложного чем упрощённый пример. Поэтому не нужно забывать про представления типов данных в PHP и сравнение значений разных типов: