Nickolay.info. PHP. Статьи. Sort and Unique strings сервис

При работе с большими списками строк, например, адресами E-mail или паролями для какой-то базы данных, словарями, логами и т.д., часто требуется автоматическая обработка этих списков:

Сортировку можно сделать и в офисных программах, а вот остальные задачи для списка из 50 или даже 5 тысяч строк никто "вручную" решать не станет, гораздо проще и удобнее написать для этой цели небольшой сервис на PHP.

Предполагается, что исходные строки заданы в кодировке Windows-1251.

Для удаления лишних пробелов, и, возможно, пустых (состоящих только из разделителей) строк достаточно одного прохода по строковому массиву, этот "ручной" проход будет работать быстрее, чем unset для разыменования отдельных элементов массива, применение фильтрующей элементы функции пользователя в array_filter или же вызов функции array_diff.

Данную работу выполняет функция array_delete_empty_items:

function array_delete_empty_items ($array,$delspaces,$delvoidstr) { 
 //Удалить лишние пробелы ($delspaces) и/или пустые строки ($delvoidstr) из массива строк $array
 $result = array();
 foreach ($array as $key => $value) {
  if ($delspaces) $value = preg_replace("/\s++/"," ",trim($value));
  if ($delvoidstr and ($value=='' or preg_match("/^\s+$/",$value))) continue;
  $result[] = $value;
 }
 return $result;
}

Вся остальная реализация выполняется стандартными функциями PHP, в итоге получается примерно вот что:

  if (!empty($in)) { //Параметр $in - входной текст, полученный через форму
   $out=$in;
   $a = explode ("\n", $out);
   if ($delspaces or $delvoidstr) $a = array_delete_empty_items ($a,$delspaces,$delvoidstr);
   if ($uniquestr) {
    if ($ignorecase) $a=array_iunique ($a);
    else $a=array_unique ($a);
   }
   if ($sortstr) {
    if ($ignorecase) usort ($a,'cmp_ignore_case');
    else sort ($a);
   }
   $out = implode ("\n", $a);
  }
  else $out= 'Нет входных данных для обработки';

Метод array_iunique умеет удалять из массива одинаковые строки без учёта регистра символов. Во избежание проблем с локалями, вся работа с преобразованием символов к нижнему регистру делается не стандартными функциями, а собственными:

  function toLower($string) { //преобразовать строку к нижнему регистру
  return strtr(strtolower($string),'ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ','ёйцукенгшщзхъфывапролджэячсмитьбю');
 };

 function cmp_ignore_case ($a,$b) { //сравнить строки с игнорированием регистра
  return strcmp(toLower($a),toLower($b));
 }

 function array_iunique ($array) { //Удаление лишних элементов массива с игнорированием регистра символов
  return array_intersect_key($array,array_unique(array_map('toLower',$array)));
 }

Надо полагать, что порядок выполнения операций тоже не безразличен - например, изначально различные строки могут стать одинаковыми после удаления лишних пробелов. Так как загрузка файла всегда потенциально опасней, чем текст из MEMO-поля, я не стал её реализовывать в онлайн-версии сервиса. В принципе, используя типовые приёмы для работы с файлами, это легко сделать.

Скрипт требует PHP 5.0.2 или выше. Онлайн-сервис может изменяться и несколько отличаться от описания.

 Сортировка строк, удаление лишних пробелов, пустых и повторяющихся строк - скрипт в работе

 Архив с исходным текстом скрипта (3 Кб)

Рейтинг@Mail.ru

вверх гостевая; E-mail