首页 > 解决方案 > PHP 或 PHPUnit 或 Laravel 是否具有递归数组比较的功能?

问题描述

我的一些 PHPUnit 测试将 Facebook 称为“php-business-sdk”,因此我可以确信 Facebook 的 API 会继续按我的预期运行。例如getInsights()FacebookAds\Object\Ad.

而那些 PHPUnit 测试一直在使用assertEqualsCanonicalizing.

但是,测试仍然很脆弱;Facebook 的 API 通常 不仅会更改结果中顶级数组(关联数组的数组)的顺序,还会更改关联数组中键的顺序。

所以我真正需要的是一个assertEqualsCanonicalizing递归版本,并且与顶级数组中关联数组的键的排序无关。

如果这样的函数已经存在(可能在 PHP、PHPUnit、Laravel 或其他地方),我宁愿不编写自己的代码。可以?

PS 下面是一个简化的结果示例:

[
  {
    "Spend": "$3,009",
    "Campaign ID": 3335626793661,
    "Reach": 37640,
    "Unique Inline Link Clicks": 2368
  },
  {
    "Spend": "$1,030",
    "Campaign ID": 3335626793662,
    "Reach": 1620,
    "Unique Inline Link Clicks": 231
  }
]

(想象下一次 API 返回相同的数据,但“Reach”写在“Spend”之前,对象的顺序也可以改变。)

PS这不是链接问题的重复,因为我专门询问如何不知道内部数组键的排序顺序。

标签: phplaravelphpunitfacebook-php-sdk

解决方案


in_array 没有递归工作的本机方法。

但是很多人已经通过这样的助手解决了这个问题:

    private function in_array_recursive($needle, $haystack, $strict = true)
    {
        foreach ($haystack as $value) {
            if (($strict ? $value === $needle : $value == $needle) || (is_array($value) && $this->in_array_recursive($needle, $value, $strict))) {
                return true;
            }
        }
        return false;
    }

推荐阅读