对于给定的数字数组,我需要打印重复项以及它们在键值对或关联数组中出现的次数。
给定数组
$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
)
我犯了什么错误?我的逻辑不对吗?
我更喜欢 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,
)%
如果你考虑你的解决方案的时间复杂度,除了逻辑错误之外它不是很有效。这是一个有效的解决方案:
<?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}
$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;
}