Intereting Posts
Codeigniter не может издеваться над объектом с помощью aspectmock Как выполняется назначение переменной в выражении? Преобразование RSA-шифрования из Javascript в PHP Получение PHP для чтения .doc-файлов в Linux Как получить ОС, на которых работает PHP? Обновление базы данных с помощью флажка php mysql Что означает = и означает в PHP? Постоянный memcached в PHP – серверный пул растет до curr_connections 10 CodeIgniter: пытается вызвать метод конструктора, чтобы проверить, зарегистрирован ли пользователь (вызывает бесконечный цикл перенаправления) Eloquent ORM – обновление и удаление не работают Как получить имена и аббревиатуры часового пояса в PHP? Приложение Yii, загруженное на хост, вызывает ошибку 404, когда я вызываю определенное действие Используйте числа, начинающиеся с 0 в переменной в php PHP / Javascript / JQuery – кодировка base64 sha256 Решение для краткого описания в watchout woocommerce wordpress не работает для меня

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