0

我正在使用以 json 格式返回搜索结果的 API。我将其解码为一个 PHP 数组,并可以通过遍历数组并将元素分配为变量从那里挑选出我需要的元素,以便我可以将值存储在数据库中。

我的问题是可能返回一个或几十个属性,它仅取决于搜索参数。如果我这样做,

$array = json_decode(file_get_contents("http://search-query-url&output=json"));

foreach($array as $cur) {
  $key1 = $cur->item_title;
  $key2 = $cur->item_url;
  $key3 = $cur->item_location;
  echo $key1 . " " . $key2 . " " . $key3 "<br>";
  }

...一切都很好,除非 item_location (key3) 在 json 输出中不存在。在这种情况下,我收到错误“未定义的属性:stdClass::$item_location”。

属性名称(item_title、item_url 等)很重要,因为这就是我知道值/字符串应该存储在哪个表列中的方式。

我很难弄清楚这个问题,我不太确定该去哪里。尝试使用 in_array 或 in_object 但我一定做错了什么。我需要根据相应的属性名称创建变量(如果存在)。

有什么想法吗?谢谢!

4

3 回答 3

1

对于这种情况,我通常的技巧是

  1. 用于json_decode($var, true)将数据解码为关联数组而不是对象。
  2. 使用array_merge为我依赖的任何键设置默认值。
  3. 如果某些字段是可选的,并且您需要知道用户是否提供了输入,则使用falsenull作为默认值。

这消除了语法上令人不快的重复键检查。

$array = json_decode(file_get_contents("http://search-query-url&output=json"), true);
$defaults = array(
    'item_title' => 'Default Title',
    'item_url' => 'default url',
    'item_location' => false
);
$array = array_merge($defaults, $array);

// check to see if we have a location or not using !==
if ($array['item_location'] !== false) {

}

我实际上更喜欢对象语法,但 PHP 有大量有用的数组操作函数。此外,许多 PHP 程序员更喜欢数组而不是对象。

于 2012-11-19T20:55:36.150 回答
0

首先也是最重要的,json_decode("JSON_STRING", true);用来让它返回一个数组而不是一个对象。

一旦你这样做,array_key_exists()就会很好地工作。

于 2012-11-19T20:48:43.863 回答
0

您可以检查是否设置了变量,如果没有为该键分配空白值。

foreach($array as $cur) {
  $key1 = (isset($cur->item_title))?($cur->item_title):('');
  $key2 = (isset($cur->item_url))?($cur->item_url):('');
  $key3 = (isset($cur->item_location))?($cur->item_location):('');
  echo $key1 . " " . $key2 . " " . $key3 "<br>";
}
于 2012-11-19T20:49:24.583 回答