web-dev-qa-db-ja.com

json_encode()を使用する場合の配列インデックス参照の削除

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ファイルで日付の一致を見つけて削除する方法はありますか?

35
d.bikov

問題に array_values() を使用します。

_$arr['dates'] = array_values($arr['dates']);
//..
$arr = json_encode($arr);
_

どうして?配列のキーを並べ替えずに設定解除しているためです。したがって、これをJSONで保持する唯一の方法は、キーもエンコードすることです。ただし、array_values()を適用すると、キーを含めずに適切にエンコードできる順序付きキー(_0_から始まる)を取得できます。

59
Alma Do

配列のインデックスを再作成する既存の試みで、array_valuesの戻り値を無視しています。正解は

$arr['dates'] = array_values($arr['dates']);

インデックスの再作成もforeachループの外側に移動する必要があります。複数回再インデックスを作成しても意味がありません。

0
Jon