Змінюй хід війни! Допомагай ЗСУ!
  • Знижка на баннерну рекламу 30%! Банер на всіх сторінках сайту, в мобільній та десктопній версії за 14 тис. грн на місяць. Статистика сайту. Контакт: kharkovforum.com@gmail.com

PHP поиск по массиву.

  • Автор теми Автор теми Mafiosi
  • Дата створення Дата створення
Я понял, мануал по ПХП писали лохи. Вполне ожидаемое заявление от такого клоуна как ты.
Чтобы не быть голословным - напиши без вложенных циклов чтение CSV файла, парсинг на поля и потом проверку каждого поля.
PHP:
foreach(file("33.csv") as $line) {
  list($field1, $field2,...) = explode(",", $line)
  ...
}



И впрям сказочный... Ты наверное думаешь, что внутри эррэй_волк-а нет цикла, да? Что там маленькие человечки вдоль массива бегают туда-сюда? :D

а при чем тут "думаешь" и "как оно реализовано внутри"? ты четко просил "код без вложеных циклов"
 
Останнє редагування:
И впрям сказочный... Ты наверное думаешь, что внутри эррэй_волк-а нет цикла, да? Что там маленькие человечки вдоль массива бегают туда-сюда? :D

ты б еще в ассемблер заглянул бы.. много нового узнаешь.

не отвлекайтесь. Вы обозначили у ТС сравнение с каждым элементом массива.
я прошу Вас показать конкретную строку, где находится оператор этого сравнения.
или балабол.
 
Здравствуйте.
И так мы рассмотрели рнр поиск по массиву ,представленный мододым и ярким поколением програмных руин умирающей цивилизации в разных вариантах.
Пусть погиблый сам выбирает вариант,от себя скажу ,они все достойны уважения и внимания.
 
вобщем вот что я намудрил на данный момент:, привожу кусок кода

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);     
    // если код 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']);
}

но есть вопросик к знатокам:
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)

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']);
 
Останнє редагування:
И впрям сказочный... Ты наверное думаешь, что внутри эррэй_волк-а нет цикла, да? Что там маленькие человечки вдоль массива бегают туда-сюда? :D
Ну тогда не мелочись, чего уж там, напиши сразу:

$num=count($data);
$i = 0;
***:
if ($i => $num) goto zzz;
echo $data[$i];
$i++;
goto ***;
zzz:

В твоем сказочном мире это тоже не цикл, верно?

господа, простите что прерываю ваш ****, но дело в том, что стандартные функции они на то и стандартные. есть там цикл или нет, мы номинально не узнаем пока не посмотрим исходники пхп. но стандартная си откомпилированная функция с циклом внутри будет работать быстрее чем цикл пхп без стандартной функции. ибо бинарно и цпю-оптимизированно.

конечно, на малых массивах с десятком элементов пофигу. но вот на больших...



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

тут вагон примеров
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.


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

опять же,
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.

там находим уже готовое решение

Код:
function similar to in_array but implements LIKE '<string>%'

<?php
   function in_array_like($referencia,$array){
      foreach($array as $ref){
        if (strstr($referencia,$ref)){         
          return true;
        }
      }
      return false;
    }
?>
 
сделал уже давно этот скрипт.
 
На всякий случай: $clean_code=preg_replace("/[^A-Z0-9]/","",strtoupper(full_code));
С запчастями на иномарки этого вполне достаточно. Если сталкивались с TecDoc, там tof_art_lookup.arl_search_number именно так сделан (в смысле тоже regexp только в transact-sql)
 
На всякий случай: $clean_code=preg_replace("/[^A-Z0-9]/","",strtoupper(full_code));
С запчастями на иномарки этого вполне достаточно. Если сталкивались с TecDoc, там tof_art_lookup.arl_search_number именно так сделан (в смысле тоже regexp только в transact-sql)

круто, спасибо. С TecDoc часто работаю, но как пользователь.
 
Назад
Зверху Знизу