PHP函数,获取2个参数,JSON字符串和日期字符串并返回JSON字符串

问题描述 投票:-1回答:4

我正在研究一个PHP问题来写一个函数,它接受两个参数:1)一个包含文章的json字符串2)格式为“2015-09-04”的字符串日期该函数应返回一个json字符串的文章在给定日期之前的两周内发表。但我得到“在第94行的C:\ wamp64 \ www \ phpExercisesW3 \ index.php中为foreach()提供的无效参数”

<?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);

        ?>
php json string decode encode
4个回答
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变量执行此操作会向您显示它为null。

JSONLint这样的工具可以在将来帮助你解决这些类型的问题,但最终,在处理javascript时,chrome控制台总是很棒。

其他错误

您的代码中有一个错误,而不是引用您在foreach循环中创建的变量,而是尝试引用原始对象数组。

看到:

if ($decode->date < strtotime('-2 weeks')) {

应该

if ($decoded->date < strtotime('-2 weeks')) {

PHP错误非常有用:

试图获取非对象的属性“日期”

您应该立即关注您的代码引用“非对象”这一事实并质疑其原因。


1
投票

错误:

  • 你的json上有逗号
  • 如果你试图在$ decode上访问日期是数组,你应该使用$ decoding-> date
  • 另外,你正在比较一个字符串($ decoding-> 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
投票

你的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
投票

你去:

<?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是无效的:有一个尾随的逗号init,你试图比较一个字符串和一个数字,你搞砸了$decoded$decode

© www.soinside.com 2019 - 2024. All rights reserved.