比较两个多维数组,但留有误差余量的空间

望远镜

我有两个数组,看起来像这样:

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,或doorscat-尺寸可能出现之前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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PHP比较两个多维数组

来自分类Dev

比较PHP中的两个多维数组以求和

来自分类Dev

PHP-查找比较两个多维数组的值

来自分类Dev

带有误差条的ggplot,用于两个测量变量和一个因子

来自分类Dev

WPF:停靠在“顶部”和“底部”的 DockPanel 中的两个控件仍然在底部留有空间

来自分类Dev

比较两个多维数组和关联数组,得到差值

来自分类Dev

如何创建比较两个矩阵的误差函数?

来自分类Dev

比较具有两个属性的项目数组

来自分类Dev

比较两个多维数组的值,如果不存在则插入

来自分类Dev

在不使用foreach循环的情况下搜索比较两个键的多维数组

来自分类Dev

比较两个多维数组的值,如果不存在则插入

来自分类Dev

Foreach中的两个多维数组

来自分类Dev

Foreach中的两个多维数组

来自分类Dev

合并两个多维数组

来自分类Dev

从具有子数组的多维数组中删除最后两个元素

来自分类Dev

比较两个N维数组

来自分类Dev

比较两个对象数组列表

来自分类Dev

如何比较两个对象数组?

来自分类Dev

比较两个int数组

来自分类Dev

比较两个对象数组

来自分类Dev

比较两个复杂的JSON数组

来自分类Dev

比较两个对象数组的元素

来自分类Dev

比较两个对象与数组的质量

来自分类Dev

比较两个numpy数组

来自分类Dev

比较两个对象数组列表

来自分类Dev

比较两个 Numpy 数组

来自分类Dev

需要来自两个多维数组的公共数组

来自分类Dev

如何从两个或多个数组创建多维数组

来自分类Dev

从两个数组创建一个多维数组