php 检查重复项并计算数组中出现的次数 [重复]

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

对于给定的数字数组,我需要打印重复项以及它们在键值对或关联数组中出现的次数。

给定数组

$arr = [1,2,2,2,4,5,5,5,8,9,10,2,5,9,10,10];

想要的结果

Array
(
    [2] => 4
    [5] => 4
    [9] => 2
    [10] => 3
)

我尝试过的:

$arr = [1,2,2,2,4,5,5,5,8,9,10,2,5,9,10,10];
sort($arr);

$duplicates = [];
$count = 1; // I assumed that at least one element is always there so I did not take 0 (if I am not wrong)

for($i = 0; $i<count($arr); $i++){  
  for($j = $i+1; $j<count($arr); $j++){
    if($arr[$i] == $arr[$j]){  
      if(!in_array($arr[$j], $duplicates)){
        // array_push($duplicates, $arr[$j]);
        $count++;
        $duplicates[$arr[$j]] = $count;
      }
    }else{
      $count = 1;
    }
  }
}

echo "<pre>";
print_r($duplicates);

这成功地将重复项返回为

key
,但出现次数不正确。

电流输出

Array
(
    [2] => 2
    [5] => 2
    [9] => 2
    [10] => 4
)

我犯了什么错误?我的逻辑不对吗?

php arrays sorting
3个回答
0
投票

我更喜欢 isset() 而不是 array_key_exists() (正如 babak-maziar 所建议的那样)。

$arr = [1,2,2,2,4,5,5,5,8,9,10,2,5,9,10,10];

foreach($arr as $i)
    isset($counters[$i])
        ? $counters[$i]++
        : $counters[$i] = 1;

var_export($counters);

输出:

array (
  1 => 1,
  2 => 4,
  4 => 1,
  5 => 4,
  8 => 1,
  9 => 2,
  10 => 3,
)%

0
投票

如果你考虑你的解决方案的时间复杂度,除了逻辑错误之外它不是很有效。这是一个有效的解决方案:

<?php
function solution($arr) {
    $result =   array();
    $i = 0;
    /* Increase count for each numbers */
    while( $i < count($arr) ) {
        $current = $arr[$i];
        if ( !array_key_exists("$current", $result) ) {
            $result["$current"] = 1;
        } else {
            $result["$current"] += 1;
        }
        $i++;
    }

    /* Remove values less than 2 */
    foreach ( $result as $k => $res ) {
        if ( $res < 2 ) {
            unset($result[$k]);
        }
    }

    echo json_encode($result);
}

solution([1,2,2,2,4,5,5,5,8,9,10,2,5,9,10,10]);
?>

输出:

{"2":4,"5":4,"9":2,"10":3}

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

您不需要使用循环,但假设您这样做,您可以使用最佳方式来完成您所做的事情。

$duplicates = [];
foreach( $arr as $item ){
    ( array_key_exists($item, $duplicates) )?
        $duplicates[$item]++:
        $duplicates[$item] = 1;
}
© www.soinside.com 2019 - 2024. All rights reserved.