Intereting Posts
PHP Вызов метода экземпляра с помощью call_user_func в том же классе вставлять контакты в базу данных, но не хочет дублировать уже существующий контакт Это хорошая идея объединить Ajax / UI JS Framework (ext, jquery-ui) с фреймворком MVC PHP (zend, symfony)? flush () Не отображает вывод в PHP? Создание экземпляра объекта из опубликованных данных – PHP я получил эту ошибку 500 | Внутренняя ошибка сервера | Doctrine_Connection_Mysql_Exception Должен ли я проверить возвращаемое значение операции выполнения в pdo php Сообщение об ошибке PHP GCM MismatchSenderId Изменение размера изображения с помощью php Imagemagick @mysql_connect и mysql_connect Является ли Google единственным поставщиком OpenID, который требует «identifier_select»? PHP получает окончательный URL-адрес перенаправления Ошибка запуска приложения Google App Engine: «C: / Documents and Settings / userName / php» является каталогом, и требуется файл конфигурации yaml php & mysql – цикл через столбцы одной строки и передача значений в массив Загрузка большого файла Apache / PHP (> 2Gb)

Как найти строку в массиве в PHP?

У меня есть массив:

$array = array("apple", "banana", "cap", "dog", etc..) up to 80 values. 

и строковая переменная:

 $str = "abc"; 

Если я хочу проверить, существует ли эта строка ( $str ) в массиве или нет, я использую preg_match , которая выглядит следующим образом:

 $isExists = preg_match("/$str/", $array); if ($isExists) { echo "It exists"; } else { echo "It does not exist"; } 

Правильно ли это? Если массив растет, будет ли он очень медленным? Есть ли другой метод? Я пытаюсь уменьшить свой трафик базы данных.

И если у меня есть две или более строк для сравнения, как я могу это сделать?

  bool in_array ( mixed $needle , array $haystack [, bool $strict ] ) 

http://php.net/manual/en/function.in-array.php

Если вам просто нужно точное совпадение, используйте in_array ($ str, $ array) – он будет быстрее.

Другим подходом было бы использование ассоциативного массива с вашими строками в качестве ключа, который должен быть логарифмически быстрее. Несомненно, вы увидите огромную разницу между этим и линейным поиском с 80 элементами.

Если вам нужно сопоставить шаблон, вам нужно будет перебрать элементы массива, чтобы использовать preg_match.


Вы отредактировали вопрос, чтобы спросить «что, если вы хотите проверить несколько строк?» – вам нужно будет перебрать эти строки, но вы можете остановиться, как только вы не получите соответствие …

 $find=array("foo", "bar"); $found=count($find)>0; //ensure found is initialised as false when no terms foreach($find as $term) { if(!in_array($term, $array)) { $found=false; break; } } 

preg_match ожидает ввода строки, а не массива. Если вы используете описанный вами метод, вы получите:

Предупреждение: preg_match () ожидает, что параметр 2 будет строкой, массив указан в LOCATION в строке X

Вы хотите in_array:

 if ( in_array ( $str , $array ) ) { echo 'It exists'; } else { echo 'Does not exist'; } 

Почему бы не использовать встроенную функцию in_array? ( http://www.php.net/in_array )

preg_match будет работать только при поиске подстроки в другой строке. ( источник )

Если у вас есть несколько значений, вы можете проверить каждое значение отдельно:

 if (in_array($str1, $array) && in_array($str2, $array) && in_array($str3, $array) /* … */) { // every string is element of the array // replace AND operator (`&&`) by OR operator (`||`) to check // if at least one of the strings is element of the array } 

Или вы можете сделать пересечение строк и массива:

 $strings = array($str1, $str2, $str3, /* … */); if (count(array_intersect($strings, $array)) == count($strings)) { // every string is element of the array // remove "== count($strings)" to check if at least one of the strings is element // of the array } 

Функция in_array () обнаруживает только полные записи, если элемент массива. Если вы хотите обнаружить частичную строку в массиве, каждый элемент должен быть проверен.

 foreach ($array AS $this_string) { if (preg_match("/(!)/", $this_string)) { echo "It exists"; } }