Лучшее решение для удаления повторяющихся значений из массива без учета регистра

Я нашел несколько решений, но я не могу решить, какой из них использовать. Каково наиболее компактное и эффективное решение для использования функции 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);