如何循环访问和访问多维和关联数组中的各种元素? PHP,JSON 或 XML

Posted

技术标签:

【中文标题】如何循环访问和访问多维和关联数组中的各种元素? PHP,JSON 或 XML【英文标题】:How to loop over and access various elements in an array that is both multidimentional and associative? PHP, either JSON or XML 【发布时间】:2015-08-06 11:15:23 【问题描述】:

我正在通过 API (zotero.org) 检索书目数据,它类似于底部的示例(只是更复杂 - 输入了示例)。

我想检索一条或多条记录并在页面上显示某些值。例如,我想遍历每个***记录并以格式良好的引文打印数据。暂时忽略正确的围兜样式,假设我只想为返回的每条记录打印以下内容:

作者 1 姓名、作者 2 姓名、文章标题、出版物标题、关键字

这与代码不匹配,因为我显然错误地引用了键值对,只会把它弄得一团糟。

如果我请求 JSON 格式,则以下内容与数据类似,但我可以请求 XML 数据。我不挑剔;我试过使用每个都没有运气。

[
  
    "key": "123456",
    "state": 100,
    "data": 
      "articleTitle": "Wombat coprogenetics: enumerating a common wombat population by microsatellite analysis of faecal DNA",
      "authors": [
        
          "firstName": "Sam C.",
          "lastName": "Smith"
        ,
        
          "firstName": "Maxine P.",
          "lastName": "Jones"
        
      ],
      "pubTitle": "Australian Journal of Zoology",
      "tags": [
         
          "tag": "scary"
        ,
        
          "tag": "secret rulers of the world"
        
      ]
   
 ,
 
   "key": "001122",
   "state": 100,
   "data": 
     "articleTitle": "WOMBAT and WOMBAT-PK: Bioactivity Databases for Lead and Drug Discovery",
     "authors": [
        
          "firstName": "Marius",
          "lastName": "Damstra"
        
      ],
      "pubTitle": "Chemical Biology: From Small Molecules to Systems Biology",
      "tags": [
        
          "tag": "Wrong Wombat"
        
      ]
    
  
]

如果括号、逗号等有错误,这只是我的示例中的一个错字,而不是我的问题的原因。

【问题讨论】:

Scrowler,感谢您的编辑!下次我会注意的。 :) 你是对的,当然。现在你不觉得温暖和模糊吗? 【参考方案1】:

decode your json 作为数组并将其作为流动的任何数组进行迭代:

$json_decoded= json_decode($json,true);

$tab="\t";

foreach ($json_decoded as $key => $val) 
    echo "Article ".$val["key"]."\n" ;
    echo $tab."Authors :\n";
    foreach ($val["data"]["authors"] as $key => $author)
        echo $tab.$tab. ($key+1) ." - ".$author["firstName"]. " ".$author["lastName"]."\n";
     

    echo $tab."Article Title: ".$val["data"]["articleTitle"] ."\n";
    echo $tab."Publication Title: ".$val["data"]["pubTitle"] ."\n";
    echo $tab."Key: ".$val["key"]."\n";

run on codepad

你可以对xml使用和flow一样的方法:

$xml = simplexml_load_string($xmlstring);
$json = json_encode($xml);
$json_decoded = json_decode($json,TRUE);
//the rest is same

对于 xml,您可以使用 SimpleXml 的函数 或DOMDocument类


提示

要了解 api 转换为数组后返回给您的数据结构,请在调试中使用 var_dump($your_decoded_json)

【讨论】:

【参考方案2】:

你试过用array_map吗?

应该是这样的:

$entries = json_decode($json, true);
print_r(array_map(function ($entry) 
    return implode(', ', array_map(function ($author) 
        return $author['firstName'];
    , $entry['data']['authors'])) . ', ' . $entry['data']['articleTitle'] . ', ' . $entry['key'];
, $entries));

【讨论】:

【参考方案3】:

这样的事情对你来说可能是一个好的开始:

$output = [];

// Loop through each entry
foreach ($data as $row) 
    // Get the "data" block
    $entry = $row['data'];
    // Start your temporary array
    $each = [
        'article title' => $entry['articleTitle'],
        'publication title' => $entry['pubTitle'],
        'key' => $row['key']
    ];
    // Get each author's name
    foreach ($entry['authors'] as $i => $author) 
        $each['author' . ++$i . ' name'] = $author['firstName'] . ' ' . $author['lastName'];
    
    // Append it to your output array
    $output[] = $each;


print_r($output);

示例:https://eval.in/369313

【讨论】:

以上是关于如何循环访问和访问多维和关联数组中的各种元素? PHP,JSON 或 XML的主要内容,如果未能解决你的问题,请参考以下文章

Java 基础 - 数组

Java数组声明创建和使用以及多维数组Arrays类稀疏数组

多维javascript数组中的for循环

如何使用指针表达式访问 C 中的二维数组的元素?

连续数组多维表示的快速元素访问

Silverstripe - 在模板中循环非关联数组