问题描述
使用以下脚本,我可以计算 10 个不同数组中每个数字的频率,然后回显对频率类别中的数字进行排序的结果(例如出现一次的值:x, y,z,出现两次的值:a,b,c,....etc.)
<?PHP $set1 = ['23','11','52','33','1','4'];
$set2 = ['66','70','55','8','22','1'];
$set3 = ['38','21','51','53','9'];
$set4 = ['14','31','54','5','73','39'];
$set5 = ['10','3','59','39'];
$set6 = ['22','13','4','39']
$set7 = ['40','30'];
$set8 = ['88','25','71','19'];
$set9 = ['10','30','49','46'];
$set10 = ['10','11'];
$mergedArray = array_merge($set1,$set2,$set3,$set4,$set5,$set6,$set7,$set8,$set9,$set10);
echo 'Values that appear 1 time: ' . implode(',',array_keys(getRepeatednumber($mergedArray,1))) . '<br>';
echo 'Values that appear 2 times: ' . implode(',2))) . '<br>';
echo 'Values that appear 3 times: ' . implode(',3))) . '<br>';
echo 'Values that appear 4 times: ' . implode(',4))) . '<br>';
echo 'Values that appear 5 times: ' . implode(',5))) . '<br>';
function getRepeatednumber($mergedArray,$requiredCount)
{
$counts = array_count_values($mergedArray);
$requiredResult = array_filter($counts,function ($value) use ($requiredCount) {
return $value == $requiredCount;
});
return $requiredResult;}
我的问题: 我想计算频率并回显应该与我的脚本的实际数组集比较的额外数字数组的结果。
例如: 如果我有
$extraset = ['1','52'] ;
我愿意
- 检查这些数字在 $set1 到 $set10 数组中出现的次数
- 像现在一样回显对频率类中的数字进行排序的结果。
但我不明白如何比较 $extraset(我是一个真正的新手..!)
感谢您的帮助!
解决方法
您可以将问题视为转换问题。您正在将数字转换为它们的频率,反之亦然。 array_count_values
将转换表设置为数组。数组的键,给出要转换的数字及其值的频率。
所以从构建合并数组开始:
$set1 = ['23','11','52','33','1','4'];
$set2 = ['66','70','55','8','22','1'];
$set3 = ['38','21','51','53','9'];
$set4 = ['14','31','54','5','73','39'];
$set5 = ['10','3','59','39'];
$set6 = ['22','13','4','39']
$set7 = ['40','30'];
$set8 = ['88','25','71','19'];
$set9 = ['10','30','49','46'];
$set10 = ['10','11'];
$mergedArray = array_merge($set1,$set2,$set3,$set4,$set5,$set6,$set7,$set8,$set9,$set10);
接下来设置转换表:
$frequencies = array_count_values($mergedArray);
然后设置这个表的逆向查找(keys是counts,values是numbers):
$inverse_frequencies = [];
foreach ($frequencies as $number => $count) {
$inverse_frequencies[$count][] = $number;
}
对此进行排序,以便键(计数)升序用于显示:
ksort($inverse_frequencies);
并显示它们:
foreach ($inverse_frequencies as $count => $numbers_array) {
echo "Values that appear $count times: " . implode(',',$numbers_array) . '<br>';
}
这种方法比你给出的方法更通用、更灵活。
接下来我们取$extraset
数组并循环查找每个元素的频率并显示它:
$extraset = ['1','52'] ;
foreach ($extraset as $element) {
$frequency = $frequencies[$element]??0;
echo "Extraset element '$element' appears $frequency times<br>";
}
注意空合并运算符 ??
的使用,以防万一我们在频率列表中找不到数字。
编辑
您可以改进集合的处理方式,方法是将每个新集合推送到一个数组中,然后合并(理想情况下您将其放入一个函数中):
$sets = [];
$sets[] = ['23','4'];
$sets[] = ['66','1'];
$sets[] = ['38','9'];
$sets[] = ['14','39'];
$sets[] = ['10','39'];
$sets[] = ['22','39'];
$sets[] = ['40','30'];
$sets[] = ['88','19'];
$sets[] = ['10','46'];
$sets[] = ['10','11'];
$mergedArray = [];
foreach ($sets as $set) {
$mergedArray = array_merge($mergedArray,$set);
}
这允许您拥有一组索引数组 ($sets
),索引较高的数组较新。
然后您可以反向搜索 $sets
数组以查找数字的最新实例:
$reverse_sets = array_reverse($sets);
foreach ($extraset as $element) {
foreach ($reverse_sets as $index => $set) {
if (in_array($element,$set)) {
$actual_index = count($reverse_sets)-$index-1;
echo "Extraset element '$element' is in set $actual_index<br>";
break;
}
}
}
您需要修复 $index
,因为反转数组会重新索引它(不保留键)。
您需要 break
,以便在您找到一个值后,立即移动到下一个值。
我将让您决定如何处理未找到的元素。