|
Поиск в массиве...Обсуждение темы Поиск в массиве... в разделе ASP, Perl, PHP и MySQL, часть категории ВЕБ-ПРОГРАММИРОВАНИЕ; Привет! Есть файл, содержащий следующее: 1|2|Яблоко 2|2|Мандарин 3|3|Апельсин 4|2|Груша 5|4|Лимон При загрузке ссылки вида link.php?id=x должен произойти поиск по первой колонке и найти ... |
|
Опции темы |
18.06.2006, 20:49 | #1 |
|
Привет!
Есть файл, содержащий следующее: 1|2|Яблоко 2|2|Мандарин 3|3|Апельсин 4|2|Груша 5|4|Лимон При загрузке ссылки вида link.php?id=x должен произойти поиск по первой колонке и найти строку, равную x. И по этой строке на экран должно быть выведено содержание третьей колонки. Т.е. если ссылка link.php?id=4 (4 строка), на экран должно быть выведено "Груша". Примечание: по номеру строки определить нельзя, так как они могут быть не по порядку. И отсортировать не получится, так как могут быть пропущенные номера. Как такое сделать? Как осуществлять поиск по первой колонке? Спасибо! |
|
18.06.2006, 23:21 | #2 |
|
Я немного сам разобрался, но не до конца.
Я подправил файл, чтобы он выглядел так: i1|2|Яблоко i2|2|Мандарин i3|3|Апельсин i4|2|Груша i5|4|Лимон И при запросе ссылки link.php?id=4 добавляю в начало переменной id "i" и ищу по запросу "i4". Даже знаю один способ находить строку: Загружаю содержание файла в массив $filecontent=file(file.txt); И потом путем перебора всех строк ищу так: if (eregi("i4", $filecontent[$i], $res)) { $info=$res[0]; } Но... мне не очень нравится способ поиска, когда перебирается каждая строка. Можно ли найти строку, содержащую i4, за один раз. Знаю, что можно искать string. А можно ли искать сразу по всему файлу, и извлекать ту строку, в которой находится поисковый запрос (i4)? Спасибо! |
|
19.06.2006, 18:42 | #3 |
|
Что-то я не понял, зачем добавлять "i" в начало строки? Ищи так:
if(strpos($filecontent[$i],$_GET['id'].'|')===0){ //Все, нашли строку, делаем с ней все, что захотим } |
|
19.06.2006, 20:55 | #4 |
|
если в файле много строк (а у меня их больше 1000), тогда под этот скрипт будут подходить такие (если id=4):
4|... 24|... 44|... ну и т.д. я добавил i для того, чтобы искать "i4|" вот тогда будет находиться только одна строка. Кстати, у меня получилось вот что: $filecontents=file("file.txt"); foreach($filecontents as $line) { if (eregi("i".$_GET['id']."|", $line)) { list($1,$2,$3)=explode("|", $line); print " $3</p>"; break; } } Сам скрипт еще не тестировал, но вроде все ок. Кстати, нашел, что break останавливает for, foreach, while и др. В моем случае (когда идет перебор всех строк - а их больше 1000), этот самый break сработает? Остановит дальнейший перебор, когда найдет "i4|"? И еще одно (вопрос профессионалам): можно ли этот скрипт упростить так, чтобы увеличить скорость вывода результата? Если например, строк будет 100000, это же долговато будет? Или я ошибаюсь? |
|
20.06.2006, 18:48 | #5 | |
|
Цитата:
$_GET['id'].'|' на нулевой позиции (в самом начале). Пусть $_GET['id'] равно 4. Тогда в этих строках: 14| 24| 34| позиция $_GET['id'].'|' (в даном случае '4|') будет равна 1, а не 0, и для этих строк условие не выполнится. Вообще, это условие будет выполняться только для одной строки, которая начинается с '4|'. Надуюсь, мои аргументы тебя убедили. Теперь ты видишь, что совать 'i' в начало каждой строки вовсе не обязательно? |
|
|
20.06.2006, 19:51 | #6 |
|
Если честно, ничего не понял. Я только начинаю осваивать php.
Постараюсь подумать над тем, что ты сказал. Спасибо большое! |
|
20.06.2006, 23:14 | #7 |
|
Надеюсь я понятно написал Удачи тебе с освоением PhP
|
|
24.06.2006, 03:32 | #8 |
|
dantistus, спасибо! Да, я понял твой скрипт. Только вот вопрос небольшой. Три знака "равно" (===) - по описанию это когда значения и типы переменных равны. По значениям понятно. А как тут с типами обстоит? Обязательно именно 3 знака равно нужно ставить в этом случае?
|
|
26.06.2006, 13:08 | #9 |
|
В логических операциях 0 преобразуется в false, а все остальное - в true (это обобщенно, иногда может и не так быть, null и undefined тоже преобразуется в false).
Функция strpos возвращает либо позицию подстроки в строке, либо false, если строка не найдена. Если написать просто так: strpos($filecontent[$i],$_GET['id'].'|')==0 то, если искомая подстрока ($_GET['id'].'|') не будет найдена, то произойдет следующее: - функция вернeт false - 0 преобразуется в false - условие віполнится, т.к. false==false - истинное утверждение. С проверкой же типов (===) все будет работать так, как надо |
|
27.06.2006, 08:02 | #10 |
|
О, теперь полностью все ясно!
Спасибо! |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Поиск в многомерном массиве | kostia | ASP, Perl, PHP и MySQL | 1 | 04.06.2014 22:55 |
Поиск CMS | Noove | ASP, Perl, PHP и MySQL | 8 | 04.08.2010 15:49 |
Поиск | Niemans | ASP, Perl, PHP и MySQL | 2 | 20.01.2010 17:30 |
Поиск | oduvan4ik | Библиотека | 4 | 23.07.2008 22:10 |
Поиск на Php | Lex | HTML, CSS, JavaScript | 4 | 10.07.2003 00:40 |
Реклама на форуме
Условия размещения рекламы
Биржа ссылок
Заработай на сайте!
|