我有两个数组,看起来像这样:
Array
(
[car] => Array
(
[color] => green
[miles] => 1.2
[consumption] => 5.0245
[doors] => 3
...
)
[cat] => Array
(
[name] => kitty
[color] => ginger
...
)
[children] => Array
(
[0] => Array
(
[assets] => Array
(
[smartphone] => 500.14
[clothes] => 1351.4
...
)
[name] => john
[age] => 16
[length] => 1.83045
...
[something_else] => Array
(
[foo] => 1.75141
[bar] => something here
...
)
),
[1] => Array
(
[assets] => Array
(
[smartphone] => 300.1
[clothes] => 598.1154
...
)
[name] => alice
[age] => 12
[length] => 1.7045
...
[something_else] => Array
(
[foo] => 8.0245
[bar] => something here too
...
)
),
...
)
[house] => Array
(
[style] => urban
[bathrooms] => 1
[electricity_consumption] => 18.420154
...
)
[last_one] => another string
)
这两个数组在每个维度上都包含相同的键,但不一定以相同的顺序。例如:children
可能出现之前cat
,或doors
在cat
-尺寸可能出现之前color
等的数目children
是可变的,但它至少1总是,和两个阵列将总是包含相同数量的children
。
我需要比较数组中是否包含相同的信息,例如:值必须相同。我曾经简单地使用过if($array1!=$array2){return false;}
,效果很好。
现在,有必要对此进行一些扩展:我想进行比较,但是请留出一些误差,使数字误差为1%。例如,如果第一个数组中的[car] [consumption]值为5.0245,而第二个数组中的[car] [consumption]值为5.0241,则结果应为数组“相同”。
我想我需要遍历每个值,找出是否为数字,比较该值以留出误差的余地,并false
在这些值之一相差1%以上时返回。
我正在尝试类似的东西:
foreach ($array1 as $key => $value)
{
if(is_array($value))
{
foreach($value as $key2 => $value2)
{
if(is_array($value2))
{
但是我很难弄清楚该如何进行比较……而且,这种方法似乎容易出现错误,而且并不是真正的未来证明(例如,将来是否应该存在额外的尺寸)。
有人知道更方便的方法吗?
function compareWithMargin($a, $b) {
if (is_array($a) || is_array($b)) { // if array, compare in depth
if (!is_array($a) || !is_array($b)) return false; // if another is not an array - then bad
if (count($a) != count($b)) return false; // not equal length
foreach ($a as $k => $v) {
if (!array_key_exists($k, $b)) return false; // no such a key in another array
if (!compareWithMargin($v, $b[$k])) return false; // comparison failed
}
return true; // good
} elseif (is_numeric($a) && is_numeric($b)) {
// compare with margin
return (abs($a - $b) <= ((abs($a) + abs($b)) * 0.005)); // difference is less than 1% of half of the sum
} else {
return $a == $b; // usual comparison
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句