Функция PHP, принимает 2 параметра, строку JSON и строку даты и возвращает строку JSON - PullRequest
0 голосов
/ 13 марта 2019

Я работаю над проблемой PHP, чтобы написать функцию, которая принимает два параметра: 1) строку json, содержащую статьи; 2) строку даты в формате "2015-09-04". Функция должна возвращать строку json. статей, которые были опубликованы за две недели до указанной даты. Но я получаю "Недопустимый аргумент для foreach () в C: \ wamp64 \ www \ phpExercisesW3 \ index.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);

        ?>

Ответы [ 4 ]

1 голос
/ 13 марта 2019

Ваш 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 голос
/ 13 марта 2019

Ошибка:

  • тянущаяся кома на вашем json
  • Ваш if пытался получить доступ к дате на $ decode, который является массивом, вы должны использовать $ decoded-> date
  • также вы сравнивали строку ($ 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);
0 голосов
/ 13 марта 2019

ваш 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"
            }
            ]
        }';   

вы не должны использовать

, 

после вашего последнего элемента в списке

0 голосов
/ 13 марта 2019

Вот, пожалуйста:

<?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.

...