Як виявити повторювані значення в масиві PHP?


115

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

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

Я хотів би надрукувати:

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

Будь-яка порада, як підійти до цієї проблеми?

Дякую.

Майк

Відповіді:


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

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
Це єдина відповідь, яка повертає лише дублюючі значення.
Редзарф

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



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
)

0

Простий метод:

$array = array_values(array_unique($array, SORT_REGULAR));

Це не враховує унікальні значення, а просто їх фільтрує.
m02ph3u5
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.