PHP或PHPUnit或Laravel是否具有用于递归数组比较的功能?

时间:2019-07-12 14:26:25

标签: php laravel phpunit facebook-php-sdk

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

那些PHPUnit测试一直在使用assertEqualsCanonicalizing

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

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

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

P.S。这是结果的简化示例:

[
  {
    "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返回相同的数据,但是在“支出”之前写入了“到达”,并且对象的顺序也可以更改。)

P.S。这不是链接问题的重复,因为我是专门询问如何与 inner 数组键的排序顺序无关。

2 个答案:

答案 0 :(得分:1)

in_array没有本地方法可以递归工作。

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

Sub test()

    Dim objFSO As Object
    Dim objFolder As Object
    Dim objFile As Object
    Dim strDir As String
    Dim wkb As Workbook

    strDir = "H:\Open Work book\"
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFSO.GetFolder(strDir)
    For Each objFile In objFolder.Files
        If objFSO.GetExtensionName(objFile) = "xlsx" Then
            Set wkb = Workbooks.Open(objFile)
            // You code here
        End If
    Next
End Sub

答案 1 :(得分:0)

直到有人展示了现有的本机功能或比这更好的功能,这似乎才对我有用:

/**
 * @see https://stackoverflow.com/q/57008999/470749
 *
 * @param array $expected
 * @param array $actual
 */
public function assertEqualsCanonicalizingInner($expected, $actual) {
    try {
        $this->assertEqualsCanonicalizing(AT::sortInnerArrays($expected), AT::sortInnerArrays($actual));
    } catch (\Exception $e) {
        $expectedSortedJson = json_encode(AT::sortInnerArrays($expected));
        $actualSortedJson = json_encode(AT::sortInnerArrays($actual));
        $this->assertTrue(false, __FUNCTION__ . ' failed: ' . PHP_EOL . $expectedSortedJson . PHP_EOL . ' vs ' . PHP_EOL . $actualSortedJson);
    }
}

/**
 * @see https://stackoverflow.com/q/57008999/470749
 * 
 * @param array $arr
 * @return array
 */
public static function sortInnerArrays($arr) {
    $resultingOuterArr = [];
    foreach ($arr as $k => $v) {
        if (is_array($v)) {
            foreach ($v as $kInner => $vInner) {
                if (is_array($vInner)) {
                    $v[$kInner] = self::sortInnerArrays($vInner);
                }
            }
            ksort($v);
        }
        $resultingOuterArr[$k] = $v;
    }
    sort($resultingOuterArr);
    return $resultingOuterArr;
}