微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将单个数组中的值与多个数组系列进行比较,然后回显结果

如何解决将单个数组中的值与多个数组系列进行比较,然后回显结果

使用以下脚本,我可以计算 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,以便在您找到一个值后,立即移动到下一个值。

我将让您决定如何处理未找到的元素。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。