2012-11-29 2 views
27

Я хотел бы подсчитать появление каждого повторяющегося элемента в массиве и в итоге получить массив только уникальных/не дублируемых элементов с их соответствующими вхождениями.Как подсчитать количество повторяющихся элементов в массиве

Это мой код; НО Я не делаю ошибку!

<?php 
$array = array(12,43,66,21,56,43,43,78,78,100,43,43,43,21); 

//$previous[value][Occurrence] 

for($arr = 0; $arr < count($array); $arr++){ 

    $current = $array[$arr]; 
    for($n = 0; $n < count($previous); $n++){ 
     if($current != $previous[$n][0]){// 12 is not 43 -----> TRUE 
      if($current != $previous[count($previous)][0]){ 
       $previous[$n++][0] = $current; 
       $previous[$n++][1] = $counter++; 
      } 
     }else{ 
      $previous[$n][1] = $counter++; 
      unset($previous[count($previous)-1][0]); 
      unset($previous[count($previous)-1][1]); 
     } 
    } 
} 
//EXPECTED VALUES 
echo 'No. of NON Duplicate Items: '.count($previous).'<br><br>';// 7 
print_r($previous);// array({12,1} , {21,2} , {43,6} , {66,1} , {56,1} , {78,2} , {100,1}) 
?>  
+4

возможно дубликат [Как обнаружить повторяющиеся значения в PHP массив?] (Http://stackoverflow.com/questions/1170807/how-to-detect-duplicate-values-in-php-array) – m2j

ответ

92

array_count_values, наслаждайтесь :-)

$array = array(12,43,66,21,56,43,43,78,78,100,43,43,43,21); 
$vals = array_count_values($array); 
echo 'No. of NON Duplicate Items: '.count($vals).'<br><br>'; 
print_r($vals); 

Результат:

No. of NON Duplicate Items: 7 
Array 
(
    [12] => 1 
    [43] => 6 
    [66] => 1 
    [21] => 2 
    [56] => 1 
    [78] => 2 
    [100] => 1 
) 
+2

then array_keys ($ array), чтобы получить желаемый выходной массив; PS Вы все должны работать над своей переменной именования –

3

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

function strInArray($haystack, $needle) { 
    $i = 0; 
    foreach ($haystack as $value) { 
     $result = stripos($value,$needle); 
     if ($result !== FALSE) return TRUE; 
     $i++; 
    } 
    return FALSE; 
} 

$array = array(12,43,66,21,56,43,43,78,78,100,43,43,43,21); 

for ($i = 0; $i < count($array); $i++) { 
    if (strInArray($array,$array[$i])) { 
     unset($array[$i]); 
    } 
} 
var_dump($array); 
2

Существует магическая функция PHP предлагает вам это называется in_array().

Использование части вашего кода мы будем изменять цикл следующим образом:

<?php 
$array = array(12,43,66,21,56,43,43,78,78,100,43,43,43,21); 
$arr2 = array(); 
$counter = 0; 
for($arr = 0; $arr < count($array); $arr++){ 
    if (in_array($array[$arr], $arr2)) { 
     ++$counter; 
     continue; 
    } 
    else{ 
     $arr2[] = $array[$arr]; 
    } 
} 
echo 'number of duplicates: '.$counter; 
print_r($arr2); 
?> 
4

если вы хотите попробовать без 'array_count_values' вы можете сделать с умным способом здесь

<?php 
$input= array(12,43,66,21,56,43,43,78,78,100,43,43,43,21); 

$count_values = array(); 
foreach ($input as $a) { 

    @$count_values[$a]++; 

} 
echo 'Duplicates count: '.count($count_values); 
print_r($count_values); 
?> 
+0

Привет Сэм Т.Мне нравится ваш метод, как вы это делаете по-умному. Не могли бы вы объяснить мне @ $ count_values ​​[$ a] ++; что @ представлять и что он делает, спасибо – whoami

0

Я пришел сюда из google ищет способ подсчета появления дубликатов в массиве. Вот способ сделать это просто:

$colors = array("red", "green", "blue", "red", "yellow", "blue"); 
$unique_colors = array_unique($colors); 
// $unique colors : array("red", "green", "blue", "yellow") 
$duplicates = count($colors) - count($unique_colors); 
// $duplicates = 6 - 4 = 2 
if($duplicates == 0){ 
echo "There are no duplicates"; 
} 
echo "No. of Duplicates are :" . $duplicates; 

// Output: No. of Duplicates are: 2 

Как array_unique() работает?

Он содержит все дубликаты. например: Допустим, у нас есть массив следующим образом -

$cars = array([0]=>"lambo", [1]=>"ferrari", [2]=>"Lotus", [3]=>"ferrari", [4]=>"Bugatti");

Когда вы $cars = array_unique($cars); автомобили будут иметь только следующие элементы. $cars = array([0]=>"lambo", [1]=>"ferrari", [2]=>"Lotus", [4]=>"Bugatti");

Чтобы узнать больше: https://www.w3schools.com/php/func_array_unique.asp

Надеется, что это полезно для тех, кто приезжает сюда из Google ищет способ подсчета повторяющихся значений в массиве.

0

Вы также можете использовать его с текстовыми элементами массива, и будет получать количество дублей правильно, но PHP показывает

Предупреждение: array_count_values ​​(): Можно рассчитывать только STRING и INTEGER значения!

$domains = 
array (
    0 => 'i1.wp.com', 
    1 => 'i1.wp.com', 
    2 => 'i2.wp.com', 
    3 => 'i0.wp.com', 
    4 => 'i2.wp.com', 
    5 => 'i2.wp.com', 
    6 => 'i0.wp.com', 
    7 => 'i2.wp.com', 
    8 => 'i0.wp.com', 
    9 => 'i0.wp.com'); 

$tmp = array_count_values($domains); 
print_r ($tmp); 

    array (
     'i1.wp.com' => 2730, 
     'i2.wp.com' => 2861, 
     'i0.wp.com' => 2807 
    ) 
Смежные вопросы