PHP: исключить из массива одинаковые строки независимо от регистра символов
На PHP исключить из массива одинаковые элементы очень легко - есть готовая функция array_unique. Если значения элементов массива это строки и исключать элементы нужно независимо от регистра символов (бАСя = БАСЯ = бася), функция перестаёт быть полезной.
Но, если немного помучиться, легко написать свою функцию для этой цели:
function array_iunique ($array) { //Удаление лишних элементов массива с игнорированием регистра символов return array_intersect_key( $array,array_unique (array_map ('toLower',$array))); }
Здесь к каждому элементу массива применяется пользовательская функция toLower
для приведения его к нижнему регистру символов.
Настройка локали бывает разная на разных хостах, и если объём данных не слишком велик,
лучше не надеяться на стандартную strtolower, а надстроить над ней свою toLower
, например, для учёта кириллицы такую:
function toLower($string) { //преобразовать строку к нижнему регистру return strtr(strtolower($string),'ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ','ёйцукенгшщзхъфывапролджэячсмитьбю'); };
Применяя эту функцию для пользовательского сравнения, строк можно удобно сортировать массивы из латинских и кириллических строк:
function cmp_ignore_case ($a,$b) { //сравнить строки с игнорированием регистра return strcmp(toLower($a),toLower($b)); } //... usort ($a,'cmp_ignore_case');
Не нужно также использовать параметр SORT_LOCALE_STRING
в array_unique
, если не уверены, что у вас на хостинге нужная локаль и Вы её правильно установили из скрипта.
Для себя применил функцию, в частности, в этом сервисе (добавил опцию "Игнорировать регистр символов при сравнении строк", действует на сортировку и удаление повторов).
19.03.2017, 10:28 [3936 просмотров]