$_REQUEST['number'] - этот параметр я беру из формы HTML $data - многмерный массив PHP: <?php $handle = fopen("33.csv", "r"); while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) { foreach($data as $value) { if (in_array($_REQUEST['number'], $data)) { //echo "Да, есть такое.."; echo "$value"; }else{ //echo "FuckOFF<br>"; } } } fclose($handle); ?> Проблема: - не могу вывести else, если данные отсутствуют в массиве(если включаю вывод - выводит его при любых раскладах) - не правильно выводиться $value(например если значение встречается), пробовал сделать <br>, но переводится значение каждой ячейки(это таблица). Чувствую что забыл что-то дописать.... Подскажите пожалуйста
вот пример csv файла с которого я массив получаю: Код (Text): 06A 903 314 E;EVR55445;Ролик;Ruville;12,5 06A 905 115 k;06B 905 115 R;Катушка;VAG;1386 06A 260 839 C;6 DPK 1195;Ремень;DAYCO;125 06A 133 064 J;408-237-115-012Z;Насос;VDO;256,98 06B 903 315 E;EVR55444;Ролик;Ruville;12,5 06A 905 115 D;06B 905 115 R;Катушка;VAG;1386 06C 260 849 C;6 DPK 1195;Ремень;DAYCO;125 06A 133 064 J;408-237-111-012Z;Насос;VDO;256,98 06A 903 315 E;EVR55444;Ролик;Ruville;12,5 06A 905 115 D;06B 905 115 R;Катушка;VAG;1386 06A 260 849 C;6 DPK 1195;Ремень;DAYCO;125 06A 135 064 J;408-237-111-012Z;Насос;VDO;256,98 06A 903 315 E;EVR55474;Ролик;Ruville;12,5 06A 907 115 D;06B 905 115 R;Катушка;VAG;1386 06A 260 849 C;6 DPK 1195;Ремень;DAYCO;125 06A 133 034 J;408-237-111-012Z;Насос;VDO;256,98 06A 903 325 E;EVR55444;Ролик;Ruville;12,5 06A 905 115 D;06B 905 115 R;Катушка;VAG;1386 06A 260 849 C;6 DPK 1195;Ремень;DAYCO;125 06A 133 064 J;408-237-111-012Z;Насос;VDO;256,98
с $value разобрался, построил таблицу и впасал его в ячейку Код (Text): echo "<td>$value</td>"; но вопрос остаётся нерешённым по поводу: почему у меня вывод работает не при определённых условиях а сам по себе(выводит всё), если посылаю в него запрос - сортирует нормально, но если отдельно запустить он делает что хочет. Вопрос - почему?
эта функция никуда не прикручивается в 99,9% случаев. это специально для программистов сделано, чтобы было легче отлаживать код, потому что она умеет рекурсивно и глубоко копать в переменные и сразу их отображать. если тяжело читать var_dump в строку, сделайте PHP: <?php echo "<pre>"; var_dump($_REQUEST, $data); echo "</pre>"; ?>
graf_vorontsov foreach ($array as $key => $val) вам в помощь! по поводу вопроса: нипанятна что вы говорите =) скажите еще. конкретно по-шагам что происходит и почему вам это не нравится.
1. Есть HTML файл с формой из которой я посылаю запрос HTML: <body> <form action="http://test1.ru/search_array.php" method="post"> <input type="text" name="number" value="Введите номер"><br> <input type="submit" value="Отправить"> </form> 2. Есть PHP файл со скриптом который обрабатывает запрос PHP: <?php $handle = fopen("33.csv", "r"); echo "<center><table width=40% border=1 cellspacing=0 cellpadding=2>"; echo "<caption>Наличие запчастей на складе</caption>"; echo "<tr><td>Оригинальный №</td><td>Неоригинальный №</td><td>Наименование</td><td>Производитель</td><td>Цена</td></tr>"; while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) { echo "<tr>"; //думаю запись foreach ($array as $key => $val) мне делать не надо, зачем мне $key? или я не прав... foreach($data as $value) { if (in_array($_REQUEST['number'], $data)) { //добавил проверку на пустой запрос, но она не работает так как надо, ниже описываю что именно. if (!empty($_REQUEST['number'])){ echo "<td>$value</td>"; //если ввожу правильный номер(т.е. который есть в массиве) то выдаёт нужный результат } else { echo "вы ничего не ввели"; //работает если ничего не ввожу(т.е. форма пустая), но!!! эта фраза выводится столько раз сколько ячеек($value) у меня в массиве(т.е. было бы 10000 - выдало б мне столько же фраз "вы ничего не ввели") break; //это моя тщетная попытка остановить скрипт :) } } } echo "</tr>"; } echo "</table></center>"; fclose($handle); ?> 3. Хочу добавить ещё проверку запроса на неправильность(ну если что-то ввожу в форму запроса чего нет в массиве моём, то чтоб выводило сообщение "нет такого номера") 4. Когда пишу в поле поиска например 2K0 511 413 D результат выводится как надо, если напишу 2K0511413D или 2K0 511 413 d мне не выдаст результат. Как сделать чтоб не учитывался регистр запроса? и написание(пробелы, кол-во символов, чтоб например я пишу 2K0511 и мне выдаёт все номера в которых это упоминается). 5. Вообще в будущем буду делать поиск как у Google т.е. по мере введения данных выводится результат, но пока мне кажется я до этого не дорос хатя ещё не разбирался с этим.... ну сначала текущую проблему решу. 6. Хочу объединить скрипт и форму в один файл, что не делать в файле HTML кнопку для возврата на предыдущую страницу(это если необходимо выполнить поиск другого номера) Т.к. при выводе результат работает файл со скриптом ПХП, а форма естественно остаётся в другом файле, но не могу этого сделать потому что скрипт начинает работать сам по себе(причём как попало) если его запустить в обход формы запроса. (после добавления if (!empty($_REQUEST['number']))) мне выдаёт 1000 фраз "вы ничего не ввели" Извините за столь обширный вопрос(он просто с комментариями)
Потихоньку пытаюсь добить всётаки этот скрипт PHP: <?php $handle = fopen("33.csv", "r"); echo "<center><table width=40% border=1 cellspacing=0 cellpadding=2>"; echo "<caption>Наличие запчастей на складе</caption>"; echo "<tr><td>Оригинальный №</td><td>Неоригинальный №</td><td>Наименование</td><td>Производитель</td><td>Цена</td></tr>"; while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) { echo "<tr>"; foreach($data as $value) { if (in_array($_REQUEST['number'], $data)) { //проверка. введены ли данные в поле поиска if (!empty($_REQUEST['number'])and isset($_REQUEST['number'])){ echo "<td>$value</td>"; //если введены данные, выдать найденый результат } else { exit("<br><h2><font color=red>Вы ничего не ввели </font></h2><br /><br />"); //если ничего не ввели в поле поиска } } } echo "</tr>"; } echo "</table></center>"; fclose($handle); ?> наставьте на путь истинный(только не посылайте матом ). как мне добавить проверку соответствие введёных данных и тех что в массиве(например: 06A 903 314 E должен равнятся запросу 06A903314E и 06A903314e и 06A90331 ). Как это организовать, с помощью preg_match и регулярных выражений? или я не там ищу? (preg_match("/......./i", $_REQUEST['number']))[/php]
Матом посылают только глупых и наглых. Take it easy. 1. Удаляем пробелы, приводим к тому виду, в каком хранятся данные в массиве. 2. Юзаем array_search \ foreach и тп, вплоть до рекурсивных функций (но за такое убивать надо на месте).
переработал скрипт свой и хотел бы получить маленькую консультацию у знатоков. Заранее спасибо. PHP: <?php $handle = fopen("33.csv", "r"); echo "<center><table width=40% border=1 cellspacing=0 cellpadding=2>"; echo "<caption>Наличие запчастей на складе</caption>"; echo "<tr><td>Оригинальный №</td><td>Неоригинальный №</td><td>Наименование</td><td>Производитель</td><td>Цена</td></tr>"; while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) { echo "<tr>"; //проверка на наличие в строке определённых символов if (strstr($_REQUEST['number'],'01C')){ $return = preg_replace('/^([\w\d]{3})\s*([\d]{3})\s*([\d+]{3})\s*([\w]{1,2})?\s*([\w\d]{3})*$/si', '$1 $2 $3 $4 01C', $_REQUEST['number']); $return = str_replace(" "," ", $return); // если код 01C } elseif (strstr($_REQUEST['number'],'2ZZ')){ $return = preg_replace('/^([\w\d]{3})\s*([\d]{3})\s*([\d+]{3})\s*([\w]{1,2})?\s*([\w\d]{3})*$/si', '$1 $2 $3 $4 2ZZ', $_REQUEST['number']); $return = str_replace(" "," ", $return); // если код 2ZZ } elseif (strstr($_REQUEST['number'],'2ER')){ $return = preg_replace('/^([\w\d]{3})\s*([\d]{3})\s*([\d+]{3})\s*([\w]{1,2})?\s*([\w\d]{3})*$/si', '$1 $2 $3 $4 2ER', $_REQUEST['number']); $return = str_replace(" "," ", $return); // если код 2ER } else //во всех остальных случаях без кода цвета $return = preg_replace('/^([\w\d]{3})\s*([\d]{3})\s*([\d]{3})\s*([\w]{1,2})?\s*$/si', '$1 $2 $3 $4', $_REQUEST['number']); foreach($data as $value) { if(in_array((strtoupper(trim($return))), $data)) { //проверка. введены ли данные в поле поиска if (!empty($return)and isset($return)){ echo "<td>$value</td>"; //если введены данные, выдать найденый результат } else { exit("<br><h2><font color=red>Вы ничего не ввели </font></h2><br /><br />"); //если ничего не ввели в поле поиска } } } echo "</tr>"; } echo "</table></center>"; fclose($handle); ?> 1) как можно в регулярном выражении записать жёсткое соответствие конкретным символам(например мне надо проверять есть ли в строке 357256222RE01C конкретная последовательность символов в данном случае 01C, эти символы всегда в конце, их всегда 3, но они могут быть и разными напр. 2ZZ, 1UT). пытался писать так PHP: preg_replace('/^([\w\d]{3})\s*([\d]{3})\s*([\d]{3})\s*(\w{1,2})*\s*(01C|2ZZ$)*/si', '$1 $2 $3 $4 $5', $request_number); вот этим (01C|2ZZ$) я пытался сделать выбор..но как-то не так работает! Т.к. предыдущий аргумент может быть или 357256222RE01C или 357256222E01C(т.е. или RE присутствует или только E). И мне выводит не то шо надо. Скрипт начинает игнорировать 4-й аргумент.... Пришлось побороть такой конструкцией: PHP: if (strstr($_REQUEST['number'],'01C')){ $return = preg_replace('/^([\w\d]{3})\s*([\d]{3})\s*([\d+]{3})\s*([\w]{1,2})?\s*([\w\d]{3})*$/si', '$1 $2 $3 $4 01C', $_REQUEST['number']); $return = str_replace(" "," ", $return); но это как-то на мой взгляд через ж*** Может есть цивилизованное решение? 2) В мануале пишут что preg_replace может содержать регулярное выражение и в шаблоне поиска и в шаблоне подстановки... Я почемуто не пойму как заставить работать регулярку в шаблоне подстановки. И где можно почитать конкретно про правила написания шаблона подстановки? 3) Я так и не понял как можно сравнить значения если символ не дописан?! Т.е по регулярке он прошёл, записался в $return , а дальше сравнивается с моими значениями в массиве PHP: if(in_array((strtoupper(trim($return))), $data)) и не проходит потому что символ не дописан. Как этого избежать? Т.е. как заставить искать все совпадения до конкретного символа?
ура!! первый вопрос я победил, подправив немного регулярку с этого PHP: preg_replace('/^([\w\d]{3})\s*([\d]{3})\s*([\d]{3})\s*(\w{1,2})*\s*(01C|2ZZ$)*/si', '$1 $2 $3 $4 $5', $_REQUEST['number']); на это PHP: preg_replace('/^([\w\d]{3})\s*([\d]{3})\s*([\d]{3})\s*(\w{1,2})?\s?(01C|2ZZ|1Y8)?$/si', '$1 $2 $3 $4 $5', $_REQUEST['number']); остались ещё вопросики...