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

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

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

我想刊登:

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

对于如何处理这个问题有什么建议吗?

谢谢。

麦克

243105 次浏览

可以使用 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...
)

将它们填充到 map(伪代码)中

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


$m[$word] += 1;
}

也许类似这样的东西(未测试的代码,但应该给您一个想法) ?

$new = array();


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

然后您将得到一个新的数组,其值作为键,它们的值是它们在原始数组中存在的次数。

你可以尝试把这个数组转换成一个关联数组,以水果作为键,以出现次数作为值。有点冗长,但看起来:

$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 />";
}

去除使用 array_unique()。检测是否有任何使用 count(array_unique())和比较 count($array)

function array_not_unique( $a = array() )
{
return array_diff_key( $a , array_unique( $a ) );
}
if(count(array_unique($array))<count($array))
{
// Array has duplicates
}
else
{
// Array does not have duplicates
}
$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;

我没有找到我要找的答案,所以我写了这个函数。这将使一个数组只包含两个数组之间的重复项,但不打印一个元素被重复的次数,所以它不能直接回答这个问题,但我希望它能对我的情况有所帮助。

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
)

一个简单的方法:

$array = array_values(array_unique($array, SORT_REGULAR));
$data = ['outer', 'inner', 'sole', 'sole', 'outer', 'outer'];


$result = max(array_count_values($data));


if($result > 1) {
echo 'Duplicate items were found!';
}

我觉得这样更短更干净。

function array_not_unique(array $array): array
{
$duplicate_array = array_diff_key( $array , array_unique( $array ) );
$unique_array = [];
foreach ($array as $key => $value) {
if ( in_array($value, $duplicate_array)) {
$duplicate_array[$key] = $value;
}
else {
$unique_array[$key] = $value;
}


}


return ["unique_array" => $unique_array, "duplicate_array" => $duplicate_array];
}

这个函数只提供冗余值

function array_find_redundant($A){
$U=$N=[];
foreach($A As $k=>$v){
if(in_array($v,$U)){$N[$k]=$v;}else{$U[]=$v;}
}
return $N;
}


$A = ['A','B','B','C','C','C'];
$B = array_find_redundant($A); // [2=>'B',4=>'C',5=>'C']