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ファイルで日付の一致を見つけて削除する方法はありますか?
問題に array_values()
を使用します。
_$arr['dates'] = array_values($arr['dates']);
//..
$arr = json_encode($arr);
_
どうして?配列のキーを並べ替えずに設定解除しているためです。したがって、これをJSONで保持する唯一の方法は、キーもエンコードすることです。ただし、array_values()
を適用すると、キーを含めずに適切にエンコードできる順序付きキー(_0
_から始まる)を取得できます。
配列のインデックスを再作成する既存の試みで、array_values
の戻り値を無視しています。正解は
$arr['dates'] = array_values($arr['dates']);
インデックスの再作成もforeach
ループの外側に移動する必要があります。複数回再インデックスを作成しても意味がありません。