Подтвердить что ты не робот

Удаление ссылки на индекс массива при использовании json_encode в php

Я сделал небольшое приложение, используя 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 файле и удалить его, без кнопок, появляющихся после кодирования?

Любая помощь приветствуется.

4b9b3361

Ответ 1

Используйте array_values() для вашей проблемы:

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

Почему? Потому что вы отключаете ключ массива, не переупорядочивая его. Таким образом, после этого единственный способ сохранить это в JSON также будет кодировать ключи. Однако после применения array_values() вы получите упорядоченные ключи (начиная с 0), которые могут быть закодированы правильно, не включая ключи.

Ответ 2

Вы игнорируете возвращаемое значение array_values в своей существующей попытке переиндексации массива. Правильно

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

Переиндексация также должна быть перемещена за пределы цикла foreach, нет смысла повторно переиндексировать несколько раз.