Вернуться   Дизайнерский форум » ВЕБ-ПРОГРАММИРОВАНИЕ » ASP, Perl, PHP и MySQL

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

Обсуждение темы Поиск в массиве... в разделе 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, 20:49
Ссылки
Старый 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
Цитата:
dantistus:
if(strpos($filecontent[$i],$_GET['id'].'|')===0){
//Все, нашли строку, делаем с ней все, что захотим
}
Проанализируй этот кусок кода. Представь себе: мы считываем строку кода (переменная $filecontent[$i]), и проверяем, содержит ли эта строка подстроку

$_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
О, теперь полностью все ясно!
Спасибо!
 
Старый 27.06.2006, 08:02
Закрытая тема


Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск в многомерном массиве 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


Текущее время: 14:01. Часовой пояс GMT +4.

Реклама на форуме Условия размещения рекламы
Биржа ссылок Заработай на сайте!
Тарифный план «Lite»
Место: 1000 Мб
Трафик: неограниченный
Панель управления
Заказать ТП «Lite»
Тарифный план «Normal»
Место: 2000 Мб
Трафик: неограниченный
Поддержка скриптов
Заказать ТП «Normal»
Тарифный план «Profy»
Место: 7000 Мб
Трафик: неограниченный
Поддержка скриптов
Заказать ТП «Profy»
Тарифный план «Места хватит!»
Место: 25 ГБ
Трафик: неограниченный
Поддержка SSI, ssh
Заказать ТП «Места хватит!»
Дизайнерский форум