2017-10-10 108 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