БлогNot. PHP: исключить из массива одинаковые строки независимо от регистра символов

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 [3811 просмотров]


теги: textprocessing памятка php алгоритм

К этой статье пока нет комментариев, Ваш будет первым