2009-02-17 3 views
9

У меня есть массив:Как найти строку в массиве в 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"; 
} 

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

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

+0

может использовать две функции in_array() и array_search() Plaese см учебник, подготовленный мной http://braincybersolutions.com/php-tutorial/php-search-in-array/ – syam

ответ

6

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

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

Если у вас do необходимо сопоставить шаблон, вам нужно будет перебрать элементы массива для использования 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; 
    } 
} 
3

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

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

4

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

Warning: preg_match() ожидает параметр 2 будет строка, массив приведен в МЕСТЕ на линии X

Вы хотите in_array:

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

Если у меня есть 2 строки, как совместить в массиве ??? – roa3

+0

строка вроде этого $ var "id1; id2"; – roa3

+0

Ответ Пола Диксона выше отвечает на это довольно хорошо. – zi3guw

2

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

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 
} 

Или вы могли бы сделать intersection обеих строк и массив:

$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

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

foreach ($array AS $this_string) { 
    if (preg_match("/(!)/", $this_string)) { 
    echo "It exists"; 
    } 
} 
Смежные вопросы