Возможно ли сравнение без учета регистра при использовании in_array
функции?
Итак, с таким исходным массивом:
$a= array(
'one',
'two',
'three',
'four'
);
Следующие запросы вернут истину:
in_array('one', $a);
in_array('two', $a);
in_array('ONE', $a);
in_array('fOUr', $a);
Какая функция или набор функций будут делать то же самое? Я не думаю, что in_array
сама может это сделать.
count(preg_grep('/^'.preg_quote($needle).'/$',$a)>0)
. Значит, не так уж элегантно. (Обратите внимание, что символы ^ и $ необходимы, если не требуется частичное совпадение.) Однако, если вы действительно хотите, чтобы возвращались совпадающие записи, мне нравится это решение.Очевидно, что нужно просто преобразовать поисковый запрос в нижний регистр:
конечно, если в массиве есть прописные буквы, вам сначала нужно сделать это:
и ищите это. Нет смысла обрабатывать
strtolower
весь массив при каждом поиске.Однако поиск по массивам является линейным. Если у вас большой массив или вы собираетесь делать это много, было бы лучше поместить условия поиска в ключ массива, так как это будет намного быстрее:
затем
Единственная проблема здесь заключается в том, что ключи массива должны быть уникальными, поэтому при столкновении (например, «один» и «один») вы потеряете все, кроме одного.
источник
Из документации
источник
>
в каждую строку, она работает. Я просто привык вручную ставить>
в первую строку.>
в начале каждой строки.Источник: страница руководства php.net in_array.
источник
Скажем, вы хотите использовать in_array, вот как вы можете сделать поиск нечувствительным к регистру.
Без учета регистра in_array ():
Нормальный чувствительный к регистру:
источник
Вышесказанное верно, если мы предполагаем, что массивы могут содержать только строки, но массивы могут содержать и другие массивы. Также функция in_array () может принимать массив для $ Needle, поэтому strtolower ($ Need) не будет работать, если $ Needle является массивом, а array_map ('strtolower', $ haystack) не будет работать, если $ haystack содержит другие массивы, но это приведет к "предупреждению PHP: strtolower () ожидает, что параметр 1 будет строкой, заданным массивом".
Пример:
Поэтому я создал вспомогательный класс с соответствующими методами, чтобы делать проверки in_array () с учетом регистра и без учета регистра. Я также использую mb_strtolower () вместо strtolower (), поэтому можно использовать другие кодировки. Вот код:
источник
Я написал простую функцию для проверки нечувствительного значения в массиве, код которого приведен ниже.
функция:
как пользоваться:
источник
источник
return
. Когда нужно найти только одну иглу, бессмысленно продолжать итерацию после ее нахождения. Я бы исправил опечатку, ввел концепцию $ strict и сделал некоторые уточнения, возможно, что-то близкое к 3v4l.org/WCTi2 . Этот пост не идеален, но его суть в нужном месте.источник
$ a = array ('один', 'два', 'три', 'четыре');
$ b = in_array ('ОДИН', $ a, ложь);
источник
true
будут использоваться строгие сравнения типов, например'1' !== 1
. Когдаfalse
будет использоваться жонглирование шрифтами, например'1' == 1
. См. Документацию на php.net/in_array и php.net/manual/en/types.comparisons.php .