我正在研究一个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);
?>
您的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错误非常有用:
试图获取非对象的属性“日期”
您应该立即关注您的代码引用“非对象”这一事实并质疑其原因。
错误:
这是你的代码工作。
<?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);
你的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"
}
]
}';
你不应该使用
,
在列表中的最后一项之后
你去:
<?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
。