【问题标题】:JSON to PHP array getting "Trying to get property of non-object in" ErrorJSON到PHP数组得到“试图获取非对象的属性”错误
【发布时间】:2018-11-11 15:54:59
【问题描述】:

您好,我有这样的 Json:

[{
    "exam_code": "1",
    "name": "Name1",
    "surname": "Surname1",
    "father_name": "Fname1",
    "id_number": "211111",
    "district_number": "21",
    "school_number": "025",
    "gender": "F",
    "variant": "A",
    "grade": "4",
    "sector": "A",
    "foreign_language": "I",
    "answerList": {
        "gradeFour": {
            "lesson1": ["A", "C", "C", "C", "A", "A", "B", "B", " ", "C", "C", "B", "A", "C", "C", "B", "B", "C", "B", "A"],
            "lesson2": ["B", "A", " ", "C", " ", "B", " ", "B", "B", "C", " ", " ", "B", "A", "A", "A", "C", "A", "B", "B"],
            "lesson3": ["A", "C", "B", "B", "A", "A", "C", "A", "C", "C"],
            "lesson4": ["B", "B", "A", "B", "B"],
            "lesson5": ["B", "A", "A", "B", "B"],
            "lesson6": ["B", "A", "A", "B", "A", "B", "A", "A", "C", "B"]
        }
    }
}]

我正在尝试在 foreach 循环中打印课程答案。

尝试以下代码:

<?php
$msc = microtime(true);


$array = (json_decode($raw_str,true));

foreach($array as $value){
echo $value['id_number'];
    echo '<br/>';

   foreach($value -> answerList->gradeFour as $val){
        echo $val;    
  }

  echo '<br>---------------------------';
  echo '<br>';

}
$msc = microtime(true)-$msc;
echo ($msc * 1000) . ' ms'; // in millseconds
?>

但出现此错误

注意:试图获取非对象的属性 G:\xampp\htdocs\siec\string_test.php on line 50 注意:试图得到 在线 G:\xampp\htdocs\siec\string_test.php 中非对象的属性 50 警告:为 foreach() 提供的参数无效 G:\xampp\htdocs\siec\string_test.php 在第 50 行

【问题讨论】:

  • 您开始使用$value['id_number'],然后切换到对象符号访问($value -&gt; answerList),您可以使用其中一种(取决于json_decode() 的第二个参数)但不能混合使用他们。

标签: php json


【解决方案1】:

在您的第二个 foreach 循环中,$value 是一个数组。所以你必须用括号[]而不是-&gt;

foreach($value['answerList']['gradeFour'] as $val) {

【讨论】:

    【解决方案2】:

    你的代码有两个问题:

    • 首先,您必须使用括号而不是 ->

    • 其次,您需要使用嵌套循环(两个 fors)来打印成绩,因为您有多个课程(另一个数组)的多个成绩(一个数组)。

    所以你的完整代码会是这样的:

    $msc = microtime(true);
    
    $array = (json_decode($raw_str,true));
    
    foreach($array as $value){
    echo $value['id_number'];
        echo '<br/>';
    
       foreach($value['answerList']['gradeFour'] as $course){
            foreach($course as $val){
                echo $val;    
            }   
        }
    
      echo '<br>---------------------------';
      echo '<br>';
    
    }
    

    【讨论】:

    • 感谢回复...已解决
    • @fischer 太好了。您可以接受答案,作为下一个访问者的指南。
    • 是否可以使用 foreach($value['answerList']['gradeFour'] as $course){ as foreach($value['answerList'][0] as $course){因为四年级五年级它是动态的
    • @fischer 不,您不能使用数字来访问命名数组。但是,您也可以在 answerList 上进行迭代。比如foreach($value['answerList'] as $numberCourses){ 和迭代$numberCourses 得到$course,等等。
    【解决方案3】:

    你的问题在第 5 行 您必须将其解码为关联数组 阅读json_decode

    查看下面的代码,它会帮助你更了解

     $array = json_decode($raw_str);
    
     foreach($array as $value){
        echo $value->id_number;
        echo '<br/>';
    
        foreach($value->answerList->gradeFour as $key => $val){
           echo $key;
           echo "<pre>";
           print_r($val);
           echo "</pre>";
    
        }
    
        echo '<br>---------------------------';
        echo '<br>';
    
    }
    

    【讨论】:

    • 这种方法对原始代码增加了太多的改变:这不得不改变他获取id_number的方式,以及他从json转换的方式。原始代码显然想要数组作为json_decode的结果,所以转换代码的其他部分是错误的。此外,这个答案只是简单地倾倒了所有的成绩,他在没有被问到时添加了pre 标签。
    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    相关资源
    最近更新 更多