我的一些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 数组键的排序顺序无关。
答案 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;
}