У меня есть массив:
$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 ] )
Если вам просто нужно точное совпадение, используйте 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"; } }