Я сделал небольшое приложение, используя 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); }
с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
, нет смысла повторно переиндексировать несколько раз.