За последние 24 часа нас посетили 18328 программистов и 1637 роботов. Сейчас ищут 1708 программистов ...

Поиск в массиве

Тема в разделе "PHP для новичков", создана пользователем lexos, 15 дек 2012.

  1. lexos

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

    С нами с:
    17 фев 2012
    Сообщения:
    19
    Симпатии:
    0
    Имеется массив в файле xxx.txt
    Код (Text):
    1. А1;1;ге;3;3;2
    2. Б1;1;шп;3;2;3
    3. В1;1;ул.;3;1;4
    4. Г1;1;г/в;3;5;55
    5. .....
    Требуется выполнить поиск в массиве по (например третьему) элементу и вывести все элементы найденной строки в столбик.
    К сожалению не могу найти, где ошибка:
    Код (Text):
    1.  
    2. $type = isset($_POST['type']) ? $_POST['type'] : '';
    3.  
    4. $fd = fopen('http://www.mysite.ru/xxx.txt', 'r');
    5. $cb = array();
    6. $clb= file("http://www.mysite.ru/xxx.txt");
    7. $numstrok = count ($clb);
    8. for ($icb=0; $icb<$numstrok; $icb++)
    9. $row = explode( ";",$clb[$icb]) {
    10. {
    11. if($row[2] === $type){
    12.         $cb = $row;
    13.  }
    14. }
    15.  
    16. if(count($cb) > 0)
    17. {
    18. print "$cb[0]<br>cb[1]<br>cb[2]<br>cb[3]<br>cb[4]<br>cb[5]<br>"; // вывод элементов массива в найденной строке
    19. }
    выводит все строки, а надо только найденную.
     
  2. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    fgetcsv - так берешь строку

    потом explode ее собираешь в массив

    и потом уже ищешь по третьему элементу
     
  3. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Надо выбрать что-то одно.

    Я бы тут не надеялся на пхп, как он там приведет типы, тем более что не особо нужно что бы данные были одного типа...
    Достаточно if($row[2] == $type)
     
  4. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    В массиве POST - всегда строка. Данные, полученные из файла - тоже всегда строка. Так что норм ===
     
  5. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    А я не говорил, что это не правильно. Я говорю о том, что если нет надобности проверять еще и тип данных, то и не надо.
    А то пхп может сделать не так как надо.

    В данном случае, я согласен, будет работать правильно.
     
  6. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ну, вообще, типы преобразуются как раз при ==. И тут теоретически может оказаться, что типы приведутся не так, как надо. А при === - сравниваются переменные как есть без преобразований каких-либо.
    Тесты (на винде, по крайней мере) - показывают, что === работает немного быстрее. Разница во времени выполнения операций сравнения зависит от сравниваемых переменных.
    Можешь сам погонять, если интересно. Например, такое:
    Код (PHP):
    1. <?php
    2. $a = 'a';
    3. $b = 'b';
    4. $start = microtime(true);
    5. for($i = 0; $i < 10000000; ++$i)
    6.     $r = $a == $b;
    7. echo('"a"=="b": ' . round(microtime(true) - $start, 5) . '<br>');
    8. $start = microtime(true);
    9. for($i = 0; $i < 10000000; ++$i)
    10.     $r = $a === $b;
    11. echo('"a"==="b": ' . round(microtime(true) - $start, 5) . '<br>');
    12. $a = '1';
    13. $b = '2';
    14. $start = microtime(true);
    15. for($i = 0; $i < 10000000; ++$i)
    16.     $r = $a == $b;
    17. echo('"1"=="2": ' . round(microtime(true) - $start, 5) . '<br>');
    18. $start = microtime(true);
    19. for($i = 0; $i < 10000000; ++$i)
    20.     $r = $a === $b;
    21. echo('"1"==="2": ' . round(microtime(true) - $start, 5) . '<br>');
    22. $a = 1;
    23. $b = 2;
    24. $start = microtime(true);
    25. for($i = 0; $i < 10000000; ++$i)
    26.     $r = $a == $b;
    27. echo('1==2: ' . round(microtime(true) - $start, 5) . '<br>');
    28. $start = microtime(true);
    29. for($i = 0; $i < 10000000; ++$i)
    30.     $r = $a === $b;
    31. echo('1===2: ' . round(microtime(true) - $start, 5));
    32. ?>
    Добавлено спустя 34 минуты 46 секунд:
    Хотя, конечно, сами по себе эти операции настолько быстрые, что смысла использовать ту или иную ради скорости выполнения - нет :)