PHP数组检查相同值的计数


PHP Array check the count of same values

我有麻烦比较两个数组与array_inersect(),从SO尝试了很多建议,但没有工作。这是我的问题:

有两个数组:

$base_array = array(2,2,2,1);
Array
(
    [0] => 2
    [1] => 2
    [2] => 2
    [3] => 1
)

另一个$risks像这样打印:

Array
(
    [0] => 2
    [1] => 3
    [2] => 4
    [3] => 1
    [4] => 2
    [5] => 8
    [6] => 6
)

我想要的是看看$base_array相同数量和类型的值是否适合$risks数组。现在它应该返回false因为数字2只出现了两次而基本数组有3。但是如果我将$base_array设置为:

$base_array = array(2,2,1);

返回true

一种方法是计算每个数字的出现次数,然后手动比较它们。为此,您需要两个数组来保存出现次数。

$base_array_count = [];
$risks_count = [];

在你的例子中,$base_array_count看起来像

$base_array_count[1] = 1
$base_array_count[2] = 2

$risks_array_count看起来像

$risks_count[1] = 1
$risks_count[2] = 2
$risks_count[3] = 1
$risks_count[4] = 1
$risks_count[6] = 1
$risks_count[8] = 1

现在循环$base_array,检查每个数字的$base_array_count值是否与$risks_array_count中的相同

编辑后的完整代码:

$base_array = array(1,2,2,7);
$risks_array = array(2,3,4,5,6,7);
$base_array_count = array();
$risks_array_count = [];
for($i = 0; $i < sizeof($base_array); $i++){
    if( !isset($base_array_count[$base_array[$i]] ))
        $base_array_count[$base_array[$i]] = 0;
    $base_array_count[$base_array[$i]]++;
}
for($i = 0; $i < sizeof($risks_array); $i++){
    if( !isset($risks_array_count[$risks_array[$i]] ))
        $risks_array_count[$risks_array[$i]] = 0;
    $risks_array_count[$risks_array[$i]]++;
}
$same = true;
if (sizeof($base_array) <= sizeof($risks_array)) {
    for ($i = 0; $i < sizeof($base_array); $i++) {
        if(!isset($risks_array_count[$base_array[$i]]) || $base_array_count[$base_array[$i]] != $risks_array_count[$base_array[$i]]){
            $same = false;
            break;
        }
    }
} else {
    $same = false;
}
if($same)
    echo "TRUE";
else
    echo "FALSE";

可以通过array_diff加上一些额外的检查来完成。看到

$base_array = array(1,2,2,7);
$risks_array = array(1,2,2,3,4,5,6);
if(array_diff($base_array, $risks_array)) // false if $base_array has type of elemenes which $risk_array does not contain 
 echo "false"; //
else{
 // $risk_array has all type of elements of $base_array. now check for similar frequency
 $freq_cnt_base = array_count_values($base_array);
 $freq_cnt_risks = array_count_values($risks_array);
 $is_similar = "true";
 foreach($freq_cnt_base as $key => $val){
    if($freq_cnt_risks[$key] !== $freq_cnt_base[$key]){
        $is_similar = "false";
        break;
    }
 }
 echo $is_similar;
}