За последние 24 часа нас посетил 22481 программист и 1141 робот. Сейчас ищут 674 программиста ...

Помогите найти ошибку в цикле вывода.

Тема в разделе "PHP для новичков", создана пользователем new_bember, 28 янв 2017.

Метки:
  1. new_bember

    new_bember Новичок

    С нами с:
    20 дек 2016
    Сообщения:
    19
    Симпатии:
    0
    Перебираю csv файл с уникальными парами значений, нахожу искомое, но вывод происходит два раза. Чувствую, где то ошибка в цикле, но понять где именно - не могу.
    PHP:
    1. <?php
    2.  
    3. /**
    4. * @author new_bember
    5. * @copyright 2017
    6. */
    7. $row=1;
    8. ini_set("auto_detect_line_endings", true);
    9. $ean = '6911234107110';
    10. if (($handle = fopen("ean.csv", "r")) !== FALSE) {
    11.     while (($data = fgetcsv($handle, 25, ';')) !== false){
    12.     $num = count($data);
    13.         //echo "<p> $num полей в строке $row: <br /></p>\n";
    14.         $row++;
    15.         for ($c=0; $c < $num; $c++) {
    16.             // echo $data[$c] . "<br />\n";
    17.             if (is_null($data[0])){
    18.          //       echo('oops');
    19.             }
    20.             elseif (strcasecmp($data[1],$ean) == 0) {
    21.                 echo($data[0]). '<br>';
    22.                 echo($data[1]). '<br>';
    23.             }
    24.         }
    25.     }  
    26. fclose($handle);
    27. }
    28. ?>
     
  2. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Ну... Вот... Ты выводишь первую и вторую строку.
     
  3. new_bember

    new_bember Новичок

    С нами с:
    20 дек 2016
    Сообщения:
    19
    Симпатии:
    0
    дело в том, что они выводятся два раза, первая,вторая,первая,вторая.
    И что интересно, в отладчике бряк ставлю на 19 строке, а он не срабатывает и программа успешно завершается с выводом четырёх строк.
     
  4. applicab

    applicab Активный пользователь

    С нами с:
    14 июл 2014
    Сообщения:
    73
    Симпатии:
    18
    да ладно сегодня же субота не обращай внимание и не ищи сложные пути разбираясь в деталях, забей, так конечно делать ненадо, но должно сработать :)
    PHP:
    1.             elseif (strcasecmp($data[1],$ean) == 0) {
    2.                 echo($data[0]). '<br>';
    3.                 echo($data[1]). '<br>';
    4.                exit();
    5.             }
     
    SamyRed нравится это.
  5. new_bember

    new_bember Новичок

    С нами с:
    20 дек 2016
    Сообщения:
    19
    Симпатии:
    0
    Так я, собственно, без спешки и пытаюсь разобраться КАК НАДО, хочу научиться писать качественно, потому и спрашиваю.
     
  6. applicab

    applicab Активный пользователь

    С нами с:
    14 июл 2014
    Сообщения:
    73
    Симпатии:
    18
    в дебагере поставьте точки остановы на том месте которое дублируется, если это echo -то именно там и по шагам смотрите когда они вызываются.

    скорее всего условие срабатывает дважды "elseif(strcasecmp($data[1],$ean)==0)", можно попытаться выполнить более строгую проверку ===, но вообще дебагер не помешает
     
  7. new_bember

    new_bember Новичок

    С нами с:
    20 дек 2016
    Сообщения:
    19
    Симпатии:
    0
    PHP:
    1. <?php
    2. /**
    3. * @author new_bember
    4. * @copyright 2017
    5. */
    6. $row=1;
    7. ini_set("auto_detect_line_endings", true);
    8. $ean = '6911234107110';
    9. if (($handle = fopen("ean.csv", "r")) !== FALSE) {
    10.     while (($data = fgetcsv($handle, 30, ';')) !== false){
    11.         $num = count($data);
    12.         if (strcasecmp($data[1],$ean) == 0) {
    13.                 echo($data[0]). '<br>';
    14.                 echo($data[1]). '<br>';
    15.             }
    16.         $row++;
    17. }  
    18. fclose($handle);
    19. }
    20. ?>
    Ларчик открывался просто: лишний цикл перебора в цикле while, и кроме того неверная максимальная длина строки во входящих параметрах fgetcsv, из-за чего fgetcsv возвращал null после каждой валидной строки.