如何检测PHP数组中的重复值?


115

我正在使用PHP中的一维数组。我想检测重复值的存在,然后计算重复值的数量并输出结果。例如,给定以下数组:

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

我想打印:

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

有关如何解决此问题的任何建议?

谢谢。

麦克风

Answers:


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


9

您可以尝试将该数组转换为关联数组,并以水果作为键,出现次数作为值。有点long,但看起来像:

$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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.