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

Я нашел несколько решений, но не могу решить, какое из них использовать.Какое наиболее компактное и эффективное решение использовать функцию php array_unique() в массиве без учета регистра?

Пример:

$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 )

Обратите внимание, что зеленый с заглавными буквами был сохранен.

Ответы [ 5 ]

12 голосов
/ 05 июня 2011

Будет ли это работать?

$r = array_intersect_key($input, array_unique(array_map('strtolower', $input)));

Не заботится о конкретном случае, чтобы сохранить, но выполняет свою работу, вы также можете попытаться вызвать asort($input); до пересечения, чтобы вместо этого сохранить заглавные значения ( демо на IDEOne.com ).

3 голосов
/ 05 июня 2011

Если вы можете использовать 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
)
1 голос
/ 05 июня 2011
function count_uc($str) {
  preg_match_all('/[A-Z]/', $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
)
0 голосов
/ 05 июня 2011

Сначала нормализуйте данные, отправив их через strtoupper() или strtolower(), чтобы согласовать регистр.Затем используйте свой array_unique ().

$normalized = array_map($input, 'strtolower');
$result = array_unique($normalized);
$result = array_map($result, 'ucwords');
print_r($result);
0 голосов
/ 05 июня 2011

Сначала вы должны сделать все значения строчными, затем запустить array_unique, и все готово

...