PHP array_filter有时输出索引号

时间:2017-10-10 15:02:22

标签: php json array-filter

我在array_filter中遇到了一些奇怪的错误。

我的json数据如下所示:

$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);

我可以使用以下代码删除一些对象:

$days_arr = array('9.10.','11.10.');

删除包含date = 9.10的对象。和10.10。 但问题是:我一使用{ "data": { "0": { "item": "book", "date": "9.10." }, "1": { "item": "pen", "date": "11.10" } } }

我的输出是:

return FirstList.Cast<IInterface>().Concat(SecondList.Cast<IInterface>()).ToList();

正如您所看到的,发生了一些非常奇怪的错误,json格式错误。 9.10。和10.10。作品,10.10。和11.10。破坏输出。

谁可以提供帮助?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

一些重要的事情:

  • array_filter将保留通过过滤器的元素的键
  • json_encode将保留输出中的数组键“如果键不是从0开始的连续数字序列”

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

您可以通过移除json_encode

调用中的键来避免您的问题
return json_encode(array_values($result));

这将使输出保持与输入相同的格式。见https://eval.in/877330