我偶然发现了一个晦涩难懂的错误,这个错误花了我很长时间才解决,而且我对其根本原因模糊不清。有人可以对我在使用array_filter
函数而不是简单循环时看到的异常情况有所了解。
我原以为以下两个代码块会产生相同的结果:
// original 'buggy' version
$obj_to->ExtendedProperties[] = array_filter($extendedProperties, function($item){
return isset($item);
});
// later, working version
foreach ($extendedProperties as $prop) {
if (isset($prop)) $obj_to->ExtendedProperties[] = $prop;
}
然而,我发送结果的API没有考虑它们的输出等效并返回400错误。我已经包含了不同json输出的样本。在一种情况下,我们在打印的json中看到一个数组indice,而在另一种情况下,我们没有。
// 'good' json
"ExtendedProperties": [
{
"Name": "MaterialCode",
"Value": "5450790E0LD048P8"
},
...
而不是
// 'bad' json
"ExtendedProperties": {
"0": {
"Name": "PreferredDate",
"Value": "2016-06-01"
},
...
答案 0 :(得分:1)
你得到了"坏" json输出,因为array_filter
保留了$extendedProperties
数组中的数组键。
http://php.net/manual/en/function.array-filter.php#99358
因为array_filter()保留了键,所以即使原始数组具有整数键,您也应该将结果数组视为关联数组,因为键序列中可能存在漏洞。这意味着,例如,json_encode()会将结果数组转换为对象而不是数组。在结果数组上调用array_values()以保证json_encode()为您提供一个数组。
答案 1 :(得分:0)
array_filter
是返回数组,这就是为什么你有数组数组。
我认为是对的:
$obj_to->ExtendedProperties = array_filter($extendedProperties, function($item){
return isset($item);
});