为什么在此PHP foreach循环中收到警告错误?

时间:2018-07-31 15:44:28

标签: php arrays json foreach

我正在跟踪一个使用foreach语句遍历json文件的教程。当然,在我遵循的示例中,此方法工作正常,但似乎无法使其在我的版本上正常工作。我认为该错误表明我实际上没有在传递数组。这是否意味着问题出在json文件中?还是有语法问题?

  

警告:第27行的C:\ xampp \ htdocs \ loops \ json_example.php中为foreach()提供的参数无效

JSON文件:movies.json

{ //json object
"movies": [ //movies = array
    {
        "title": "The Godfather",
        "year": "1972",
        "genre": "Drama",
        "director": "Francis Ford Copolla"
    },
    {
        "title": "Superbad",
        "year": "2007",
        "genre": "Comedy",
        "director": "Greg Mottola"
    },
    {
        "title": "The Departed",
        "year": "2006",
        "genre": "Drama",
        "director": "Martin Scorsese"
    },
    {
        "title": "Saving Private Ryan",
        "year": "1998",
        "genre": "Action",
        "director": "Steven Spielberg"
    },
    {
        "title": "The Expendables",
        "year": "2010",
        "genre": "Action",
        "director": "Sylvester Stallone"
    }
]
}

PHP代码:json_example.php

    <?php
    $jsondata = file_get_contents("movies.json"); #set variable, function "file_get_contents" grabs everything in the file. can also use with a website is url is within () to insert entire site.

    $json = json_decode($jsondata, true); #decodes json so that we can parse it
?>

<!DOCTYPE html>
<html>
<head>
    <title>JSON Example</title>
</head>

<body>
    <div id="container">
        <h1>My Favorite Movies</h1>
        <ul>
            <?php      
                foreach($json['movies'] as $key => $value) {
                    echo '<h4>'.$value['title'].'</h4>';
                    echo '<li>Year: '.$value['year'].'</li>';
                    echo '<li>Genre: '.$value['genre'].'</li>';
                    echo '<li>Director: '.$value['director'].'</li>';
                }
            ?>
        </ul>
    </div>

</body>

</html>

请原谅我的评论,我还在学习。

2 个答案:

答案 0 :(得分:0)

您的json_decode由于错误的json格式而失败。 JOSN格式错误

$test =' { //json object
    "movies": [ //movies = array
        {
            "title": "The Godfather",
            "year": "1972",
            "genre": "Drama",
            "director": "Francis Ford Copolla"
        }]}';

json内的任何注释都将被视为json字符串,而由于格式错误,导致json解码失败

$decode = json_decode($test,TRUE) ; // fails to decode due to bad json if you var_dump($decode) result in null

删除json字符串中的注释

$test =' { 
    "movies": [ 
        {
            "title": "The Godfather",
            "year": "1972",
            "genre": "Drama",
            "director": "Francis Ford Copolla"
        }]}';

答案 1 :(得分:0)

  

为foreach()提供的参数无效

表示您使用的$json['movies']

foreach($json['movies'] as $key => $value) {

不是数组或对象。 Finally have my title

  

foreach仅适用于数组和对象,当您尝试在具有不同数据类型的变量或未初始化的变量上使用它时,将发出错误消息。

从理论上讲,$json = json_decode($jsondata, true);应该产生一个包含键'movies'的数组,其中包含电影数组,但是由于您收到无效的参数警告,这意味着由于某种原因没有发生

如果您的movie.json文件确实包含注释,那就是原因。正如其他人所说,The PHP documentation states

如果文件中实际上没有注释,或者如果您删除了注释但仍未获得所需的数组,则可以使用JSON cannot contain commentsjson_last_error来帮助诊断问题。

对于由于某种原因而无法解析输入文件的情况,您应在代码中包含某种错误处理。在这种情况下,可能是因为您在不知不觉中添加了注释,但是将来如果您从其他来源获取文件,则可能无法控制其内容。仅检查if (is_array($json['movies']))就足以验证您可以使用foreach进行迭代。您要如何处理自己不想要的情况。