我使用jQuery的datepicker
创建了一个小应用程序。我从JSON文件设置不可用的日期,如下所示:
{ "dates": ["2013-12-11", "2013-12-10", "2013-12-07", "2013-12-04"] }
我想检查一下给定的日期是否已经在此列表中,如果是,则将其删除。我目前的代码如下:
if (isset($_GET['date'])) //the date given
{
if ($_GET['roomType'] == 2)
{
$myFile = "bookedDates2.json";
$date = $_GET['date'];
if (file_exists($myFile))
{
$arr = json_decode(file_get_contents($myFile), true);
if (!in_array($date, $arr['dates']))
{
$arr['dates'][] = $_GET['date']; //adds the date into the file if it is not there already
}
else
{
foreach ($arr['dates'] as $key => $value)
{
if (in_array($date, $arr['dates']))
{
unset($arr['dates'][$key]);
array_values($arr['dates']);
}
}
}
}
$arr = json_encode($arr);
file_put_contents($myFile, $arr);
}
}
我的问题是,在我再次对数组进行编码后,它看起来像这样:
{ "dates": ["1":"2013-12-11", "2":"2013-12-10", "3":"2013-12-07", "4":"2013-12-04"] }
有没有办法在JSON文件中找到日期匹配并将其删除,而在编码后没有出现键?
答案 0 :(得分:57)
使用array_values()
解决您的问题:
$arr['dates'] = array_values($arr['dates']);
//..
$arr = json_encode($arr);
为什么呢?因为你没有重新排序它而没有设置数组的密钥。所以在此之后,保持JSON的唯一方法也是编码键。但是,在应用array_values()
之后,您将获得有序密钥(从0
开始),可以正确编码而不包含密钥。
答案 1 :(得分:1)
在Laravel collections中(以防万一),您可以
$newArray = $collection->values()->toArray();
或
$jsonEncoded = $collection->values()->toJson();
答案 2 :(得分:0)
您在现有尝试重新索引数组时忽略了array_values
的返回值。正确是
$arr['dates'] = array_values($arr['dates']);
重建索引也应移到foreach
循环之外,多次重建索引没有意义。