2017-10-10 112 views
0

我遇到了array_filter的一些奇怪的错误。PHP array_filter输出有时索引号

我的JSON数据是这样的:

{ 
    "data": [ 
     { 
      "item": "book", 
      "date": "9.10." 
     }, 
     { 
      "item": "apple", 
      "date": "10.10." 
     }, 
     { 
      "item": "pen", 
      "date": "11.10." 
     } 
    ] 
} 

我可以删除某些对象与此代码:

$days_arr = array('9.10.','10.10.'); 
    $result['data'] = array_filter($my_var['data'], function($v) use ($days_arr) 
     { 
     return in_array($v['date'], $days_arr); 
     }); 
     return json_encode($result); 

从而消除包含日期= 9.10的对象。和10.10。 但问题:当我使用$days_arr = array('9.10.','11.10.');

我的输出是这样的:

{ 
    "data": { 
     "0": { 
      "item": "book", 
      "date": "9.10." 
     }, 
     "1": { 
      "item": "pen", 
      "date": "11.10" 
     } 
    } 
} 

因此,大家可以看到,一些非常奇怪的错误发生,JSON是完全错误的格式化。 9.10。和10.10。作品,10.10。和11.10。破坏输出。

谁能帮忙?

+0

我怀疑它实际上与你给出的例子发生:https://eval.in/877329,如果你结束了指数0,2剩余的(注意差距虽这么说),那么等价的JSON结构将是一个对象而不是一个数组 – apokryfos

回答

1

巧合的是,您的第一个示例会生成从0,0和1开始的连续索引,因此json_encode()会将它们编码为动态分配。第二个例子产生索引0和2,因此它使用硬编码值。使用array_values()重新编制索引:

$result['data'] = array_values($result['data']); 
return json_encode($result); 
0

几个重要的事情:

  • array_filter将保留通过过滤器
  • json_encode将保留数组键在输出“,如果该键是不是一个连续的数值序列的起始的元素的键从0"

因此,当你$result数组包含数组键01,他们跳过在JSON输出。当它包含数组键02(如第二个示例中所示)时,它们将被保留。

您可以通过删除在通话键json_encode避免你的问题:

return json_encode(array_values($result)); 

这将保持输出相同的格式输入。请参阅https://eval.in/877330