计算并显示数组中唯一值的出现次数

问题描述 投票:0回答:15

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

$array = [
    'apple',
    'orange',
    'pear',
    'banana',
    'apple',
    'pear',
    'kiwi',
    'kiwi',
    'kiwi'
];

我要打印:

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

关于如何解决这个问题有什么建议吗?

php arrays counting
15个回答
266
投票

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

129
投票
if(count(array_unique($array))<count($array))
{
    // Array has duplicates
}
else
{
    // Array does not have duplicates
}

47
投票
function array_not_unique( $a = array() )
{
    return array_diff_key( $a , array_unique( $a ) );
}

结果:(演示

array (
  4 => 'apple',
  5 => 'pear',
  7 => 'kiwi',
  8 => 'kiwi',
)

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

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;
}

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


1
投票

把它们塞进一个

map
(伪代码)

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

    $m[$word] += 1;
}

1
投票

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

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
)

1
投票
$data = ['outer', 'inner', 'sole', 'sole', 'outer', 'outer'];

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

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

我认为这种方式更短更干净。


1
投票
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];
    }

1
投票

这个函数只给你多余的值

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'] 

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
投票
$arr = [1,2,2,2,4,5,5,5,8,9,10,2,5,9,10,10];
array_count_values($arr); 
// OUT PUT Array(
//    2 => 4
//    5 => 4
//    9 => 2
//   10 => 3
// )

// If you want unique items
$items = array_keys( array_intersect( array_count_values($arr), [1] ) )

//If you want duplicate items 
$duplicates = array_keys( array_diff( array_count_values($arr), [1] ) )

0
投票

循环

array_count_values()
返回的键和值,如果大于一次则有条件地打印出现次数。

代码:(演示

foreach (array_count_values($array) as $value => $count) {
    printf("%s%s\n", $value, $count > 1 ? " ($count)" :'');
}

-1
投票

一个简单的方法:

$array = array_values(array_unique($array, SORT_REGULAR));
© www.soinside.com 2019 - 2024. All rights reserved.