it-swarm.com.ru

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

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

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

Я хотел бы напечатать:

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

Любой совет, как подойти к этой проблеме?

Благодарю.

Майк

97
mikey_w

Вы можете использовать array_count_values ​​ function

$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...
)
210
Silfverstrom
if(count(array_unique($array))<count($array))
{
    // Array has duplicates
}
else
{
    // Array does not have duplicates
}
99
Ritvick Paliwal
function array_not_unique( $a = array() )
{
  return array_diff_key( $a , array_unique( $a ) );
}
30
Anton Maryanov

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

8
helpful tip

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

$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 />";
}
6
Simon Scarfe
<?php

$arr = array(1, 2, 3, 2, 5, 6, 7);

print_r(array_count_values($arr));

?>
3
tarun

Заполните их в map (псевдокод)

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

    $m[$Word] += 1;
}
2
Anton Gogolev

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

$new = array();

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

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

2
$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
uday

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

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
aswine