Как обнаружить повторяющиеся значения в массиве 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
Это единственный ответ, который возвращает только повторяющиеся значения.
Redzarf

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.