为什么array_filter的json渲染输出与foreach的输出不同?

时间:2016-05-11 14:04:10

标签: php json array-filter

我偶然发现了一个晦涩难懂的错误,这个错误花了我很长时间才解决,而且我对其根本原因模糊不清。有人可以对我在使用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"
  },
...

2 个答案:

答案 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);
});