За последние 24 часа нас посетил 56961 программист и 1789 роботов. Сейчас ищут 877 программистов ...

Поиск по многомерному массиву. Запутался.

Тема в разделе "PHP для новичков", создана пользователем graf_vorontsov, 14 фев 2011.

  1. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    $_REQUEST['number'] - этот параметр я беру из формы HTML
    $data - многмерный массив

    PHP:
    1. <?php
    2.     $handle = fopen("33.csv", "r");
    3.     while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {        
    4.         foreach($data as $value) {
    5.             if (in_array($_REQUEST['number'], $data)) {
    6.                 //echo "Да, есть такое..";
    7.                 echo "$value";
    8.             }else{
    9.                 //echo "FuckOFF<br>";
    10.             }
    11.         }
    12.    }
    13.    fclose($handle);
    14. ?>

    Проблема:
    - не могу вывести else, если данные отсутствуют в массиве(если включаю вывод - выводит его при любых раскладах) :)
    - не правильно выводиться $value(например если значение встречается), пробовал сделать <br>, но переводится значение каждой ячейки(это таблица).

    Чувствую что забыл что-то дописать.... Подскажите пожалуйста
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    пример массива дай
     
  3. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    вот пример csv файла с которого я массив получаю:
    Код (Text):
    1. 06A 903 314 E;EVR55445;Ролик;Ruville;12,5
    2. 06A 905 115 k;06B 905 115 R;Катушка;VAG;1386
    3. 06A 260 839 C;6 DPK 1195;Ремень;DAYCO;125
    4. 06A 133 064 J;408-237-115-012Z;Насос;VDO;256,98
    5. 06B 903 315 E;EVR55444;Ролик;Ruville;12,5
    6. 06A 905 115 D;06B 905 115 R;Катушка;VAG;1386
    7. 06C 260 849 C;6 DPK 1195;Ремень;DAYCO;125
    8. 06A 133 064 J;408-237-111-012Z;Насос;VDO;256,98
    9. 06A 903 315 E;EVR55444;Ролик;Ruville;12,5
    10. 06A 905 115 D;06B 905 115 R;Катушка;VAG;1386
    11. 06A 260 849 C;6 DPK 1195;Ремень;DAYCO;125
    12. 06A 135 064 J;408-237-111-012Z;Насос;VDO;256,98
    13. 06A 903 315 E;EVR55474;Ролик;Ruville;12,5
    14. 06A 907 115 D;06B 905 115 R;Катушка;VAG;1386
    15. 06A 260 849 C;6 DPK 1195;Ремень;DAYCO;125
    16. 06A 133 034 J;408-237-111-012Z;Насос;VDO;256,98
    17. 06A 903 325 E;EVR55444;Ролик;Ruville;12,5
    18. 06A 905 115 D;06B 905 115 R;Катушка;VAG;1386
    19. 06A 260 849 C;6 DPK 1195;Ремень;DAYCO;125
    20. 06A 133 064 J;408-237-111-012Z;Насос;VDO;256,98
     
  4. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    с $value разобрался, построил таблицу и впасал его в ячейку
    Код (Text):
    1. echo "<td>$value</td>";
    но вопрос остаётся нерешённым по поводу: почему у меня вывод работает не при определённых условиях а сам по себе(выводит всё), если посылаю в него запрос - сортирует нормально, но если отдельно запустить он делает что хочет. Вопрос - почему?
     
  5. VItalijs

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

    С нами с:
    17 дек 2008
    Сообщения:
    244
    Симпатии:
    0
    Адрес:
    Рига, Латвия
    var_dump($_REQUEST, $data) и сравниваем, ищем что же там в массиве есть.
     
  6. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    да... что-то не могу понять как эта функция работает и как её притулить к моему скрипту :(
     
  7. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    эта функция никуда не прикручивается в 99,9% случаев. это специально для программистов сделано, чтобы было легче отлаживать код, потому что она умеет рекурсивно и глубоко копать в переменные и сразу их отображать. если тяжело читать var_dump в строку, сделайте
    PHP:
    1. <?php
    2. echo "<pre>";
    3. var_dump($_REQUEST, $data);
    4. echo "</pre>";
    5. ?>
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    graf_vorontsov
    foreach ($array as $key => $val) вам в помощь!

    по поводу вопроса: нипанятна что вы говорите =) скажите еще. конкретно по-шагам что происходит и почему вам это не нравится.
     
  9. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    1. Есть HTML файл с формой из которой я посылаю запрос
    HTML:
    1. <form action="http://test1.ru/search_array.php" method="post">
    2. <input type="text" name="number" value="Введите номер"><br>
    3. <input type="submit" value="Отправить">
    4. </form>
    5.  
    2. Есть PHP файл со скриптом который обрабатывает запрос
    PHP:
    1.  
    2. <?php
    3.     $handle = fopen("33.csv", "r");
    4.     echo "<center><table width=40% border=1 cellspacing=0 cellpadding=2>";
    5.     echo "<caption>Наличие запчастей на складе</caption>";
    6.     echo "<tr><td>Оригинальный №</td><td>Неоригинальный №</td><td>Наименование</td><td>Производитель</td><td>Цена</td></tr>";
    7.  
    8.     while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
    9.         echo "<tr>";
    10. //думаю запись foreach ($array as $key => $val) мне делать не надо, зачем мне $key? или я не прав...
    11.         foreach($data as $value) {
    12.             if (in_array($_REQUEST['number'], $data)) {
    13. //добавил проверку на пустой запрос, но она не работает так как надо, ниже описываю что именно.
    14.                 if (!empty($_REQUEST['number'])){
    15.                     echo "<td>$value</td>";
    16.                     //если ввожу правильный номер(т.е. который есть в массиве) то выдаёт нужный результат
    17.                 } else {
    18.                     echo "вы ничего не ввели"; //работает если ничего не ввожу(т.е. форма пустая), но!!! эта фраза выводится столько раз сколько ячеек($value) у меня в массиве(т.е. было бы 10000 - выдало б мне столько же фраз "вы ничего не ввели")
    19.                     break; //это моя тщетная попытка остановить скрипт :)
    20.                 }
    21.             }
    22.         }
    23.         echo "</tr>";
    24.    }
    25.    echo "</table></center>";
    26.    fclose($handle);
    27. ?>
    28.  
    3. Хочу добавить ещё проверку запроса на неправильность(ну если что-то ввожу в форму запроса чего нет в массиве моём, то чтоб выводило сообщение "нет такого номера")

    4. Когда пишу в поле поиска например 2K0 511 413 D результат выводится как надо, если напишу 2K0511413D или 2K0 511 413 d мне не выдаст результат. Как сделать чтоб не учитывался регистр запроса? и написание(пробелы, кол-во символов, чтоб например я пишу 2K0511 и мне выдаёт все номера в которых это упоминается).

    5. Вообще в будущем буду делать поиск как у Google т.е. по мере введения данных выводится результат, но пока мне кажется я до этого не дорос :) хатя ещё не разбирался с этим.... ну сначала текущую проблему решу.

    6. Хочу объединить скрипт и форму в один файл, что не делать в файле HTML кнопку для возврата на предыдущую страницу(это если необходимо выполнить поиск другого номера) Т.к. при выводе результат работает файл со скриптом ПХП, а форма естественно остаётся в другом файле, но не могу этого сделать потому что скрипт начинает работать сам по себе(причём как попало) если его запустить в обход формы запроса. (после добавления if (!empty($_REQUEST['number']))) мне выдаёт 1000 фраз "вы ничего не ввели" :)

    Извините за столь обширный вопрос(он просто с комментариями) :)
     
  10. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    Потихоньку пытаюсь добить всётаки этот скрипт
    PHP:
    1. <?php
    2.     $handle = fopen("33.csv", "r");
    3.     echo "<center><table width=40% border=1 cellspacing=0 cellpadding=2>";
    4.     echo "<caption>Наличие запчастей на складе</caption>";
    5.     echo "<tr><td>Оригинальный №</td><td>Неоригинальный №</td><td>Наименование</td><td>Производитель</td><td>Цена</td></tr>";
    6.  
    7.     while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
    8.         echo "<tr>";
    9.         foreach($data as $value) {
    10.             if (in_array($_REQUEST['number'], $data)) {
    11.              
    12.                 //проверка. введены ли данные в поле поиска
    13.                 if (!empty($_REQUEST['number'])and isset($_REQUEST['number'])){              
    14.                     echo "<td>$value</td>"; //если введены данные, выдать найденый результат
    15.                 } else {
    16.                     exit("<br><h2><font color=red>Вы ничего не ввели </font></h2><br /><br />"); //если ничего не ввели в поле поиска
    17.                 }
    18.  
    19.             }
    20.         }
    21.         echo "</tr>";
    22.    }
    23.    echo "</table></center>";
    24.    fclose($handle);
    25.    
    26. ?>
    27.  
    наставьте на путь истинный(только не посылайте матом :)). как мне добавить проверку соответствие введёных данных и тех что в массиве(например: 06A 903 314 E должен равнятся запросу 06A903314E и 06A903314e и 06A90331 ). Как это организовать, с помощью preg_match и регулярных выражений? или я не там ищу?

    (preg_match("/......./i", $_REQUEST['number']))[/php]
     
  11. admyx

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

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Матом посылают только глупых и наглых. Take it easy.

    1. Удаляем пробелы, приводим к тому виду, в каком хранятся данные в массиве.
    2. Юзаем array_search \ foreach и тп, вплоть до рекурсивных функций (но за такое убивать надо на месте).
     
  12. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    переработал скрипт свой и хотел бы получить маленькую консультацию у знатоков. Заранее спасибо.
    PHP:
    1. <?php
    2.     $handle = fopen("33.csv", "r");
    3.     echo "<center><table width=40% border=1 cellspacing=0 cellpadding=2>";
    4.     echo "<caption>Наличие запчастей на складе</caption>";
    5.     echo "<tr><td>Оригинальный №</td><td>Неоригинальный №</td><td>Наименование</td><td>Производитель</td><td>Цена</td></tr>";
    6.     while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
    7.  
    8.         echo "<tr>";
    9.         //проверка на наличие в строке определённых символов
    10.         if (strstr($_REQUEST['number'],'01C')){
    11.             $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']);
    12.             $return = str_replace("  "," ", $return);    
    13.         // если код 01C
    14.         } elseif (strstr($_REQUEST['number'],'2ZZ')){
    15.             $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']);
    16.             $return = str_replace("  "," ", $return);          
    17.         // если код 2ZZ
    18.         } elseif (strstr($_REQUEST['number'],'2ER')){
    19.             $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']);
    20.             $return = str_replace("  "," ", $return);          
    21.         // если код 2ER
    22.         } else
    23.         //во всех остальных случаях без кода цвета
    24.         $return = preg_replace('/^([\w\d]{3})\s*([\d]{3})\s*([\d]{3})\s*([\w]{1,2})?\s*$/si', '$1 $2 $3 $4', $_REQUEST['number']);
    25.                  
    26.         foreach($data as $value) {                      
    27.             if(in_array((strtoupper(trim($return))), $data)) {
    28.             //проверка. введены ли данные в поле поиска
    29.                 if (!empty($return)and isset($return)){  
    30.                                  
    31.                     echo "<td>$value</td>"; //если введены данные, выдать найденый результат
    32.                 } else {
    33.                     exit("<br><h2><font color=red>Вы ничего не ввели </font></h2><br /><br />"); //если ничего не ввели в поле поиска
    34.                 }
    35.  
    36.             }
    37.              
    38.         }
    39.         echo "</tr>";
    40.    }
    41.    echo "</table></center>";
    42.    fclose($handle);
    43. ?>
    1) как можно в регулярном выражении записать жёсткое соответствие конкретным символам(например мне надо проверять есть ли в строке 357256222RE01C конкретная последовательность символов в данном случае 01C, эти символы всегда в конце, их всегда 3, но они могут быть и разными напр. 2ZZ, 1UT).
    пытался писать так
    PHP:
    1. 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:
    1.  if (strstr($_REQUEST['number'],'01C')){
    2.             $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']);
    3.             $return = str_replace("  "," ", $return);
    но это как-то на мой взгляд через ж*** :) Может есть цивилизованное решение?

    2) В мануале пишут что preg_replace может содержать регулярное выражение и в шаблоне поиска и в шаблоне подстановки... Я почемуто не пойму как заставить работать регулярку в шаблоне подстановки.
    И где можно почитать конкретно про правила написания шаблона подстановки?

    3) Я так и не понял как можно сравнить значения если символ не дописан?! Т.е по регулярке он прошёл, записался в $return , а дальше сравнивается с моими значениями в массиве

    PHP:
    1. if(in_array((strtoupper(trim($return))), $data))  
    и не проходит потому что символ не дописан. Как этого избежать? Т.е. как заставить искать все совпадения до конкретного символа?
     
  13. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    ура!! первый вопрос я победил, подправив немного регулярку
    с этого

    PHP:
    1.  
    2. 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:
    1.  
    2. 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']);
    остались ещё вопросики...
     
  14. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    уже не актуально. сделал.