Как обнаружить повторяющиеся значения в массиве PHP?

115

Я работаю с одномерным массивом в PHP. Я хотел бы обнаружить наличие повторяющихся значений, затем подсчитать количество повторяющихся значений и вывести результаты. Например, учитывая следующий массив:

$array = array('apple', 'orange', 'pear', 'banana', 'apple',
   'pear', 'kiwi', 'kiwi', 'kiwi');

Я хочу напечатать:

apple (2)
orange
pear (2)
banana
kiwi (3)

Есть какие-нибудь советы, как подойти к этой проблеме?

Спасибо.

Майк

mikey_w
источник

Ответы:

239

Вы можете использовать функцию array_count_values

$array = array('apple', 'orange', 'pear', 'banana', 'apple',
'pear', 'kiwi', 'kiwi', 'kiwi');

print_r(array_count_values($array));

выведет

Array
(
   [apple] => 2
   [orange] => 1
   [pear] => 2
   etc...
)
Silfverstrom
источник
1
Это решение не распространяется на какие-либо нецелочисленные и нестроковые значения и, в конечном итоге, вызывает побочные эффекты.
codekandis
110
if(count(array_unique($array))<count($array))
{
    // Array has duplicates
}
else
{
    // Array does not have duplicates
}
Ритвик Паливал
источник
«... затем подсчитайте количество повторяющихся значений и выведите результаты».
showdev
Это решение не распространяется на какие-либо нецелочисленные и нестроковые значения и, в конечном итоге, вызывает побочные эффекты. Использование array_unique($array, SORT_REGULAR)заставляет PHP проверять элементы в обычном режиме без изменения типа, но это слабое сравнение. Таким образом, разные экземпляры одного класса с одинаковым содержанием будут унифицированы.
codekandis
38
function array_not_unique( $a = array() )
{
  return array_diff_key( $a , array_unique( $a ) );
}
Антон Марьянов
источник
1
Это единственный ответ, который возвращает только повторяющиеся значения.
Redzarf
1
Расширен, чтобы дать только список повторяющихся значений (что мне было нужно):return array_values(array_unique(array_diff_key($a, array_unique($a))));
Осенний Леонард
9

Вы можете попробовать превратить этот массив в ассоциативный массив с фруктами в качестве ключей и количеством вхождений в качестве значений. Немного многословно, но похоже:

$array = array('apple', 'orange', 'pear', 'banana', 'apple',
   'pear', 'kiwi', 'kiwi', 'kiwi');
$new_array = array();
foreach ($array as $key => $value) {
    if(isset($new_array[$value]))
        $new_array[$value] += 1;
    else
        $new_array[$value] = 1;
}
foreach ($new_array as $fruit => $n) {
    echo $fruit;
    if($n > 1)
        echo "($n)";
    echo "<br />";
}
Саймон Скарф
источник
1
Хороший ответ, но в PHP есть функция, которая делает именно это: array_count_values
Navarr
9

Чтобы избавиться от использования array_unique(). Чтобы определить, есть ли у них какое-либо применение, count(array_unique())и сравнить с count($array).

Aksu
источник
2

Поместите их в map(псевдокод)

map[string -> int] $m
foreach($word in $array)
{
    if(!$m.contains($word))
        $m[$word] = 0;

    $m[$word] += 1;
}
Антон Гоголев
источник
2

Возможно, что-то вроде этого (непроверенный код, но должен дать вам представление)?

$new = array();

foreach ($array as $value)
{
    if (isset($new[$value]))
        $new[$value]++;
    else
        $new[$value] = 1;
}

Затем вы получите новый массив со значениями в качестве ключей, а их значением будет количество раз, которое они существовали в исходном массиве.


источник
Хороший ответ, но в PHP есть такая функция: array_count_values
Navarr
0
$count = 0;
$output ='';
$ischeckedvalueArray = array();
for ($i=0; $i < sizeof($array); $i++) {
    $eachArrayValue = $array[$i];
    if(! in_array($eachArrayValue, $ischeckedvalueArray)) {
        for( $j=$i; $j < sizeof($array); $j++) {
            if ($array[$j] === $eachArrayValue) {
                $count++;
            }
        }
        $ischeckedvalueArray[] = $eachArrayValue;
        $output .= $eachArrayValue. " Repated ". $count."<br/>";
        $count = 0;
    }

}

echo $output;
Удай
источник
0

Я не нашел ответа, который искал, поэтому написал эту функцию. Это создаст массив, который будет содержать только дубликаты между двумя массивами, но не будет печатать количество дублирований элемента, поэтому он не отвечает напрямую на вопрос, но я надеюсь, что это поможет кому-то в моей ситуации.

function findDuplicates($array1,$array2)
{
    $combined = array_merge($array1,$array2);
    $counted = array_count_values($combined);
    $dupes = [];
    $keys = array_keys($counted);
    foreach ($keys as $key)
    {   
        if ($counted[$key] > 1)
        {$dupes[] = $key;}
    }
    sort($dupes);
    return $dupes;
}
$array1 = [1,2,3,4,5];
$array2 = [4,5,6,7,8];
$dupes = findDuplicates($array1,$array2);
print_r($dupes);

Выходы:

Array
(
    [0] => 4
    [1] => 5
)
aswine
источник
0

Простой способ:

$array = array_values(array_unique($array, SORT_REGULAR));
жизнь
источник
Это не считает неуникальные значения, а просто фильтрует их.
m02ph3u5