我有两个关联数组:
ArrayA = array( [10] => ten
[12] => twelve
[22] => 10
[30] => 10, 12, 8
)
ArrayB = array( [10] => net
[12] => evlewt
[22] => 11, 12, 10
[30] => 10
)
两个数组上相同键的值需要进行比较。有些键具有CSV值,并且可以在两个数组上。
例如,ArrayA
上的[22]
应在ArrayB
上的CSV中进行检查。同样,ArrayB
中的[30]
应在ArrayA
上以CSV进行检查。其他应与通常的==
进行比较
注意:我试图避免这里出现循环。我们当然可以通过Loop以多种方式做到这一点。我想知道是否有一种快速有效的方法可以在不循环的情况下做到这一点。
编辑:为了进一步澄清,以下是这两者应该如何进行比较:
Is "ten" in ArrayA == "net" in ArrayB?
Is "twelve" in ArrayA == "evlewt" in ArrayB?
Is 10 in ArrayA existing in (11, 12, 10) of ArrayB?
Is (10, 12, 8) of ArrayA containing the 10 ArrayB?
我希望我能正确理解这个问题。如果你先将数据标准化,你就可以比较阵列
例如:
$a = array(
10 => 'net',
12 => 'evlewt',
22 => '10,12,11',
30 => '12,10'
);
$b = array(
10 => 'net',
12 => 'evlewt',
22 => '11,12,10',
30 => '12,10'
);
function normalize(&$value, $key) {
$value = explode(',', $value);
sort($value);
$value = implode(',', $value);
}
array_walk($a, 'normalize');
array_walk($b, 'normalize');
var_dump($a == $b); // outputs true
EDIT:为了通过两个数组中的一个元素是否是另一个数组的子集来评估两个数组,我会将值规范化为数组,并使用reduce_array()
函数。
<?php
$a = array(
10 => 'net',
12 => 'evlew',
22 => '10,12,11',
30 => '12,10,11'
);
$b = array(
10 => 'net',
12 => 'evlewt',
22 => '11,12,10',
30 => '12,10'
);
function normalize(&$value, $key) {
$value = explode(',', $value);
}
function compare_value($v, $w) {
if (false === $v) return false;
global $a, $b;
if(is_subset($a[$w], $b[$w]) || is_subset($b[$w], $a[$w]))
return true;
return false;
}
function is_subset($needle, $haystack) {
return count(array_intersect($needle, $haystack)) === count($needle);
}
array_walk($a, 'normalize');
array_walk($b, 'normalize');
$result = array_reduce(array_keys($a), 'compare_value', true);
var_dump($result); // outputs false
$a = array(
10 => 'net',
12 => 'evlewt',
22 => '10',
30 => '12,10,11'
);
$b = array(
10 => 'net',
12 => 'evlewt',
22 => '11,12,10',
30 => '12,10'
);
array_walk($a, 'normalize');
array_walk($b, 'normalize');
$result = array_reduce(array_keys($a), 'compare_value', true);
var_dump($result); // outputs true