我有麻烦比较两个数组与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;
}