#php #json #string #decode #encode
#php #json #строка #расшифровывать #кодировать
Вопрос:
Я работаю над проблемой PHP, чтобы написать функцию, которая принимает два параметра: 1) строку json, содержащую статьи 2) строку date в формате «2015-09-04» Функция должна возвращать строку json статей, которые были опубликованы за две недели до указанной даты. Но я получаю «Недопустимый аргумент, предоставленный для foreach() в C:wamp64wwwphpExercisesW3index.php в строке 94 «
<?php
$json = '[
{
"title": "This is the first title",
"body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2015-07-30"
},
{
"title": "Another article",
"body": "Quisqu porttitor dignissim massa rhoncus imperdiet.",
"date": "2015-08-18"
},
{
"title": "The Final Title",
"body": "In aliquam auctor ex quis consequat. Praesent non lobortis metus.",
"date": "2015-08-30"
},
]';
$date = "2015-09-04";
function returnTwoWeeksPrior($jsonString, $dateString) {
$decode = json_decode($jsonString);
forEach($decode as $decoded) {
if ($decode->date < strtotime('-2 weeks')) {
$result = json_encode($decoded);
echo $result;
} else {
echo "No articles found.";
}
}
}
echo returnTwoWeeksPrior($json, $date);
?>
Комментарии:
1. В вашем json ошибка. Вы должны удалить свой последний
,
2.
var_dump($decode);
иecho json_last_error_msg();
3.
$decoded
не$decode
Ответ №1:
Ваш JSON недопустим. Почему?
Смотрите эти строки:
{
"title": "The Final Title",
"body": "In aliquam auctor ex quis consequat. Praesent non lobortis metus.",
"date": "2015-08-30"
},
]';
У вас есть лишний ‘,’, который необходимо удалить, чтобы он был допустимым массивом.
Должно быть:
{
"title": "The Final Title",
"body": "In aliquam auctor ex quis consequat. Praesent non lobortis metus.",
"date": "2015-08-30"
}
]’;
Ваш первый шаг при подобной проблеме — использовать var_dump() или var_export() вашу ожидаемую переменную. Выполнение этого с вашей переменной $ decode показало бы вам, что она была нулевой.
Существуют такие инструменты, как JSONLint, которые могут помочь вам в будущем с подобными проблемами, но, в конце концов, консоль chrome всегда хороша при работе с javascript.
Другие ошибки
В вашем коде ошибка, из-за которой вместо ссылки на переменную, которую вы создаете в цикле foreach, вы пытаетесь ссылаться на исходный массив объектов.
Смотрите:
if ($decode->date < strtotime('-2 weeks')) {
Должно быть
if ($decoded->date < strtotime('-2 weeks')) {
Здесь ошибка PHP весьма полезна:
Пытаюсь получить свойство ‘date’ не-объекта
Сразу же вам следует сосредоточиться на том факте, что ваш код ссылается на «не-объект», и задаться вопросом, почему это может быть.
Комментарии:
1. Спасибо, что заметили это. Теперь ошибка, которую я получаю, заключается в попытке получить свойство ‘date’ не-объекта в C:wamp64wwwphpExercisesW3index.php в строке 95. Почему это говорит мне, что $ decode не является объектом? Я расшифровал ее, превратив в объект с помощью моего кода «$ decode = json_decode ($ jsonString);»
2. Спасибо. Другие ответы возвращают мне все три статьи, но через две недели из моей переменной $ date должна быть возвращена только последняя статья.
3. Ваше фактическое сравнение дат имеет ряд проблем, включая тот факт, что ваше сравнение должно быть > , а не < . Рабочая версия здесь .
Ответ №2:
Ошибки:
- завершающая кома в вашем json
- ваш if пытался получить доступ к дате в $ decode, который является массивом, вы должны использовать $decoded-> дата
- кроме того, вы сравнивали строку ($decoded-> date) и значение int (strtotime(‘-2 недели’))
Вот ваш рабочий код.
<?php
$json = '[
{
"title": "This is the first title",
"body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2015-07-30"
},
{
"title": "Another article",
"body": "Quisqu porttitor dignissim massa rhoncus imperdiet.",
"date": "2015-08-18"
},
{
"title": "The Final Title",
"body": "In aliquam auctor ex quis consequat. Praesent non lobortis metus.",
"date": "2015-08-30"
}
]';
$date = "2015-09-04";
function returnTwoWeeksPrior($jsonString, $dateString) {
$decode = json_decode($jsonString);
$results = [];
forEach($decode as $decoded) {
if (strtotime($decoded->date) < (strtotime($dateString.'-2 weeks')) ) {
$result = json_encode($decoded);
echo $result;
$results[] = $result;
}
}
if(count($results) == 0){
echo "No articles found.";
}
}
echo returnTwoWeeksPrior($json, $date);
Комментарии:
1. Спасибо, что заметили это. Теперь ошибка, которую я получаю, заключается в попытке получить свойство ‘date’ не-объекта в C:wamp64wwwphpExercisesW3index.php в строке 95. Почему это говорит мне, что $ decode не является объектом? Я расшифровал ее, превратив в объект с помощью моего кода «$ decode = json_decode ($ jsonString);»
2. Спасибо. Однако вывод с этим кодом возвращает все три статьи, и он должен возвращать только объект final Title, поскольку это единственная статья с датой за последние две недели 2015-09-04
3. действительно, я только что прочитал код и предположил, что это было 2 недели назад с текущей даты, а не с использованием заданного времени. Я также внес некоторые изменения в печать результатов, которые не найдены только в конце.
Ответ №3:
ваш json должен выглядеть следующим образом
$json = '{
"items" :[
{
"title": "This is the first title",
"body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2015-07-30"
},
{
"title": "Another article",
"body": "Quisqu porttitor dignissim massa rhoncus imperdiet.",
"date": "2015-08-18"
},
{
"title": "The Final Title",
"body": "In aliquam auctor ex quis consequat. Praesent non lobortis metus.",
"date": "2015-08-30"
}
]
}';
вы не должны использовать
,
после вашего последнего элемента в списке
Ответ №4:
Вот так:
<?php
$json = '[
{
"title": "This is the first title",
"body": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"date": "2015-07-30"
},
{
"title": "Another article",
"body": "Quisqu porttitor dignissim massa rhoncus imperdiet.",
"date": "2015-08-18"
},
{
"title": "The Final Title",
"body": "In aliquam auctor ex quis consequat. Praesent non lobortis metus.",
"date": "2015-08-30"
}
]';
$date = "2015-09-04";
function returnTwoWeeksPrior($jsonString, $dateString) {
$decode = json_decode($jsonString);
forEach($decode as $decoded) {
if (strtotime($decoded->date) < strtotime('-2 weeks', strtotime($date))) {
$result = json_encode($decoded);
echo $result;
} else {
echo "No articles found.";
}
}
}
echo returnTwoWeeksPrior($json, $date);
?>
Прежде всего, ваш JSON недопустим: в конце инициализации стоит запятая, и вы пытаетесь сравнить строку с числом, и вы напутали $decoded
и $decode
.
Комментарии:
1. Спасибо за вашу помощь. Однако мой вывод с помощью этого кода возвращает все, и он должен возвращать только конечный объект Title, поскольку это единственная статья с датой за последние две недели 2015-09-04