Функция PHP, принимает 2 параметра, строку JSON и строку даты и возвращает строку JSON

#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