Как найти строку в массиве в PHP? - PullRequest
9 голосов
/ 17 февраля 2009

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

$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";
}

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

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

Ответы [ 6 ]

34 голосов
/ 17 февраля 2009
 bool in_array  ( mixed $needle  , array $haystack  [, bool $strict  ] )

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

6 голосов
/ 17 февраля 2009

Если вам просто нужно точное совпадение, используйте 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;
   }
}
4 голосов
/ 17 февраля 2009

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

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

Вы хотите in_array:

if ( in_array ( $str , $array ) ) {
    echo 'It exists';
} else {
    echo 'Does not exist';
}
3 голосов
/ 17 февраля 2009

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

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

2 голосов
/ 17 февраля 2009

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

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
}
0 голосов
/ 12 мая 2016

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

foreach ($array AS $this_string) {
  if (preg_match("/(!)/", $this_string)) {
    echo "It exists"; 
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...