【问题标题】:How to loop through a JSON array and put data in variables如何遍历 JSON 数组并将数据放入变量中
【发布时间】:2018-05-20 13:01:20
【问题描述】:

我正在尝试从 API 获取数据并将其保存到 MySQL 数据库。问题是当我想回显数据以检查它是否获得了我收到此错误的所有值时:

注意:试图获取非对象的属性

我的 JSON 数据如下所示:

{"AttractionInfo":[{"Id":"sprookjesbos","Type":"Attraction","MapLocation":"1","State":"open","StateColor":"green","WaitingTime":0,"StatePercentage":0},{"Id":"zanggelukkig","Type":"Show","MapLocation":".","State":"gesloten","StateColor":"clear"},

我认为这是因为它在一个数组中。因为当我使用这段代码时,它不会出错,但我必须定义数组的索引。遍历我的数据并将其放入变量的最佳方法是什么?

<?php

    //Get content
    $url = "https://eftelingapi.herokuapp.com/attractions";
    $data = json_decode(file_get_contents($url));

    //Fetch data
    $attractieId = $data->AttractionInfo[0]->Id;
    $attractieType = $data->AttractionInfo[0]->Type;
    $attractieStatus = $data->AttractionInfo[0]->State;
    $attractieStatusKleur = $data->AttractionInfo[0]->StateColor;
    $attractieWachttijd = $data->AttractionInfo[0]->WaitingTime;
    $attractieStatusPercentage = $data->AttractionInfo[0]->StatePercentage;

?>

我试图找到一些解决方案,但他们使用的只是一个 foreach 循环。但我认为这行不通。谁能帮助我朝着好的方向发展或告诉我如何解决这个问题?我不是很有经验,所以欢迎任何建议。提前致谢。

更新代码:

require 'database-connection.php';
//Get content
$url = "https://eftelingapi.herokuapp.com/attractions";
$data = json_decode(file_get_contents($url));

//Fetch data
$attractieId = isset($data->AttractionInfo->Id);
$attractieType = isset($data->AttractionInfo->Type);
$attractieStatus = isset($data->AttractionInfo->State);
$attractieStatusKleur = isset($data->AttractionInfo->StateColor);
$attractieWachttijd = isset($data->AttractionInfo->WaitingTime);
$attractieStatusPercentage = isset($data->AttractionInfo->StatePercentage);

$sql =  "INSERT INTO attracties (attractieId, attractieType, attractieStatus, attractieStatusKleur, attractieWachttijd, attractieStatusPercentage) 
VALUES ('$attractieId', '$attractieType', '$attractieStatus', '$attractieStatusKleur', '$attractieWachttijd', '$attractieStatusPercentage')";
if ($db->query($sql) === TRUE) {
    echo "success";
} else {
    echo "Error: " . $sql . "<br>" . $db->error;
}

它说“成功”,但是当我查看我的数据库时,它只插入了空数据。我需要将所有景点添加到我的数据库中,而不仅仅是一行。所以我需要遍历我的数据。

【问题讨论】:

  • 看起来并非数组中的所有对象都具有所有相同的变量。您需要用 isset() 包装每个分配以避免错误。您也可以使用print_r($data); 进行快速调试,看看哪个似乎丢失了,哪个会抛出 no property 错误。
  • 当我将 isset() 包裹在作业周围时,它不再出现错误。但是当我尝试回显变量时,它什么也没显示。你知道为什么会这样吗? @兰德尔
  • 好吧,如果没有属性,就没有可变数据。所以它应该什么都不回应。我希望。您可以将未设置的变量设置为用于调试目的的东西:$test = (isset($data-&gt;AttractionInfo[0]-&gt;StatePercentage) ? $data-&gt;AttractionInfo[0]-&gt;StatePercentage : 'OH NO!' );
  • 能否请您展示您如何尝试回应它以及您如何尝试插入到您的 mysql 中?你需要只插入第一行还是全部?
  • 你需要准确地写 $attractieId 还是你可以只写 $Id

标签: php mysql arrays json


【解决方案1】:

试试这个...

$content = json_decode(file_get_contents($url));

foreach($content->AttractionInfo as $data ){
      $id      = $data->Id;
      $type    = $data->Type;
      $map     = $data->MapLocation;
      $state   = $data->State;
      $color   = $data->StateColor;
      if(!empty($data->WaitingTime)) {
      $time = $data->WaitingTime;
      }
     if(!empty($data->StatePercentage)) {
       $percent = $data->StatePercentage;
     }

  //persist your data into DB....
}

【讨论】:

  • 感谢这段代码为我工作!它现在将每个景点都保存到我的数据库中
【解决方案2】:

我认为你需要这样的东西:

    $json = '{"AttractionInfo":[{"Id":"sprookjesbos","Type":"Attraction","MapLocation":"1","State":"open","StateColor":"green","WaitingTime":0,"StatePercentage":0},{"Id":"zanggelukkig","Type":"Show","MapLocation":".","State":"gesloten","StateColor":"clear"}]}';
    $arr = json_decode($json);

     foreach ($arr->AttractionInfo as $key => $attraction) {
       foreach($attraction as $key=> $value) {
          print_r($key.' - '.$value.'<br>');
          $$key = $value;
       }
    }

echo '<br>';
echo $Id; // it will be last item/attraction id.

我们可以改进这段代码。只需说出您想在哪里以及如何使用它

【讨论】:

    猜你喜欢
    • 2012-04-12
    • 2018-01-25
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 2022-08-19
    • 1970-01-01
    相关资源
    最近更新 更多