Я нашел несколько решений, но я не могу решить, какой из них использовать. Каково наиболее компактное и эффективное решение для использования функции array_unique()
php в массиве без учета регистра?
Пример:
$input = array('green', 'Green', 'blue', 'yellow', 'blue'); $result = array_unique($input); print_r($result);
Результат:
Array ( [0] => green [1] => Green [2] => blue [3] => yellow )
Как удалить дубликат green
? Что касается удаления, мы предполагаем, что дубликаты с прописными буквами верны.
например, сохранить PHP
удалить php
или оставить PHP
удалять Php
поскольку PHP
имеет больше символов в верхнем регистре.
Таким образом, результат будет
Array ( [0] => Green [1] => blue [2] => yellow )
Обратите внимание, что зеленый с верхним регистром сохранен.
Будет ли это работать?
$r = array_intersect_key($input, array_unique(array_map('strtolower', $input)));
Не заботится о конкретном случае, чтобы сохранить, но выполняет эту работу, вы также можете попытаться вызвать asort($input);
перед пересечением, чтобы сохранить капитализированные значения ( demo на IDEOne.com ).
Если вы можете использовать PHP 5.3.0, вот функция, которая делает то, что вы ищете:
<?php function array_unique_case($array) { sort($array); $tmp = array(); $callback = function ($a) use (&$tmp) { if (in_array(strtolower($a), $tmp)) return false; $tmp[] = strtolower($a); return true; }; return array_filter($array, $callback); } $input = array( 'green', 'Green', 'php', 'Php', 'PHP', 'blue', 'yellow', 'blue' ); print_r(array_unique_case($input)); ?>
Вывод:
Array ( [0] => Green [1] => PHP [3] => blue [7] => yellow )
function count_uc($str) { preg_match_all('/[AZ]/', $str, $matches); return count($matches[0]); } $input = array( 'green', 'Green', 'yelLOW', 'php', 'Php', 'PHP', 'gREEN', 'blue', 'yellow', 'bLue', 'GREen' ); $input=array_unique($input); $keys=array_flip($input); array_multisort(array_map("strtolower",$input),array_map("count_uc",$input),$keys); $keys=array_flip(array_change_key_case($keys)); $output=array_intersect_key($input,$keys); print_r( $output );
вернется:
Array ( [2] => yelLOW [5] => PHP [6] => gREEN [9] => bLue )
Сначала вы должны сделать все значения в нижнем регистре, а затем запустить array_unique, и все готово
Сначала нормализуйте свои данные, отправив их через strtoupper()
или strtolower()
чтобы сделать аргумент согласованным. Затем используйте array_unique ().
$normalized = array_map($input, 'strtolower'); $result = array_unique($normalized); $result = array_map($result, 'ucwords'); print_r($result);