【问题标题】:Multi-Dimensional Array Challenge in PHP From Json Data [duplicate]来自 Json 数据的 PHP 中的多维数组挑战 [重复]
【发布时间】:2020-09-07 06:18:08
【问题描述】:

我一直在努力正确输出我从 REST API 响应中收到的 json 数据的内容。我进行了很多搜索并尝试了不同的方法,但我注意到每个人的方法总是独一无二的……下面是我的代码……特别要考虑的是“headers_field”,它是一个包含很多值和键的数组……我想要也用键输出这些值......虽然(“数据”)有两个值......下面是我也尝试过的,但我只是从循环中得到第一个结果,而它返回(“headers_field ": Array), ("box: Array")..我使用了 Curl。请往下看。谢谢。

{
"data": [
    {
        "approved": null,
        "approved_user_id": null,
        "boxes": [],
        "created": "2020-05-19T21",
        "created_at": "2020-05-19T21",
        "edited": null,
        "edited_in_affiliate": null,
        "edited_in_hdr": null,
        "edited_in_web_app": null,
        "erp_project_id": null,
        "error_description": "",
        "header_fields": [
            {
                "boxes": [],
                "code": "creditor_number",
                "data_type": "",
                "error": "",
                "feature_id": nvnnn,
                "value": "hhhhh"
            },
            {
                "boxes": [],
                "code": "payment_account_number",
                "data_type": "",
                "error": "",
                "value": ""
            },
            {
                "boxes": [],
                "code": "order_number",
                "data_type": "",
                "error": "",
                "value": ""
            },
            {
                "boxes": [],
                "code": "total_amount_incl_vat",
                "data_type": "",
                "error": "",
                "feature_id": mmm
                "value": "hhh"
            },
   {
        "approved": null,
        "approved_user_id": null,
        "boxes": [],
        "created": "2020-05-19",
        "created_at": "2020-05-19",
        "edited": null,
        "edited_in_affiliate": null,
        "edited_in_hdr": null,
        "edited_in_web_app": null,
        "erp_project_id": null,
        "error_description": "",
        "header_fields": [
            {
                "boxes": [],
                "code": "reference",
                "data_type": "",
                "error": "",
                "value": ""
            },
            {
                "boxes": [],
                "code": "payment_swift_bic",
                "data_type": "",
                "error": "",
                "value": ""
            },

            {
                "boxes": [],
                "code": "recipient_vat_reg_no",
                "data_type": "",
                "error": "",
                "value": ""
            },

            {
                "boxes": [],
                "code": "joint_payment_id",
                "data_type": "",
                "error": "",
                "value": ""
            },

            {
                "boxes": [],
                "code": "catalog_debitor_id",
                "data_type": "",
                "error": "",
                "value": ""
            },

            {
                "boxes": [],
                "code": "case_number",
                "data_type": "",
                "error": "",
                "value": ""
            },


            {
                "boxes": [],
                "code": "payment_account_number",
                "data_type": "",
                "error": "",
                "value": ""
            },
            {
                "boxes": [],
                "code": "payment_iban",
                "data_type": "",
                "error": "",
                "value": ""
            }


      ],
        "id": 00000,
        "image": "https://skkkkkllllllllll
        "line_items": [],
        "note": "",
        "organization_id": 11111,
        "organization_voucher_id": 7777,
        "page_count": 1,
        "status": "successful",
        "type": "voucher",
        "upload_type": "affiliate",
        "uploaded_by_user_id": 0000001
        "user_payment_method": "",
        "user_voucher_type": ""
   }
   ],
    "meta": {
    "count": 2
   }
   }

我的循环操作

  .....
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $request);
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$results= curl_exec($ch);

   $g= json_decode($results, true);

   $i=0;
  $g_length =count($g["data"]);//to count through the child array

  for ($i=0; $i < ($g_length);$i++)
   {

      $k= $g["data"][$i]; //asssigning the array position to a variable

      foreach($k as $mydata=>$mvalue) {
    $hey = trim($mvalue); //Removes white spaces
    if ($mvalue !=="")
    echo $mydata. " : " . $mvalue . "<br>"; 

    else

    echo "This is empty. <br/>";


    ///////////////////////////////////////////
    foreach($mvalue as $lkey=>$lvalue)
    {
    $u=is_array($mvalue);
    if(($u) and !empty($u))
    echo $lkey. ":" . $lvalue. "<br>";
    else

    echo "what? <br/>";
    ///////////
    foreach($lvalue as $okey=>$ovalue)
    {

    echo $okey. ":". $value. "</n>";
    /////
 foreach($ovalue as $key=>$value)
 {
      $v=is_array($value);
      if(($v) and !empty($v))
      echo $key. ":" . $value. "<br>";
      else
    echo "hello";
      //print_r($key);

      /////
  }
    }
    //////////
  }

  //////////////////////////////////////////
 }

【问题讨论】:

  • 我了解您真诚地尝试解决此问题并且您需要帮助。然而,关于这个主题的“雪花问题”(“每个人都是独一无二的”)每天都会在这里发布很多次。 Stack Overflow 被“如何迭代这个多维数组”这些问题过度饱和,而这些问题(正如你所承认的)对未来的研究人员几乎没有帮助。因此,Stack Overflow 保留数百个这样的问题几乎没有价值。
  • 如果您想要特定的值而不是每条数据,那么可以为您提供更具体/更窄的答案。这就是为什么 Toby 的答案是通用的,而不是专门帮助您访问命名的关键数据的原因。对于需要“打开”并显示Array() 输出的开发人员,解决方案是非常简单地循环属于该特定键的数据。用连续的循环-n-打印波来探索您的数据并没有错,直到您得到您需要的东西。
  • 深思:3v4l.org/g7CMX
  • 我看到了您与我的问题相关联的两个链接;老实说,他们;对这种事情不熟悉的人尤其没有帮助。如果他们确实回答了这个问题,因为它在这里以更深入和更简单的方式回答,我会理解并使用它们。这就是为什么我非常感谢@Toby Harris 用最基本的术语简化了它。但是,我也很感谢您发送的最后一个链接。这很多。谢谢。

标签: php json rest curl multidimensional-array


【解决方案1】:

如果您知道从 API 返回的数组有多深或有多少维度,并且您知道密钥结构将相同,您可以使用以下内容:

注意:我使用了您的 JSON,并快速而肮脏地吐出了所有键和值 - 包括嵌套的标头字段。本质上它基于该值是否为数组。如果你知道你所期望的结构,你可以通过创建一个数组映射和一个函数来处理所有作为子数组的 vals 来使它更优雅。

无论如何 - 我希望以下内容可以帮助您作为初学者:

foreach($theDecodedData['data']["header_fields"] as $row){

    foreach($row as $key => $val){

        if(!is_array($val)){

            echo "$key: $val \n";
        }
        else{
             echo "Contents of $key \n";
            foreach($val as $vkey => $vval){

                if(!is_array($vval)){

                    echo "$vkey: $vval \n";
                }
                else{

                    echo "Contents of $vkey \n";
                    foreach($vval as $vvvkey => $vvvval){
                        if(!is_array($vvvval)){

                            echo "$vvvkey: $vvvval \n";
                        }
                        else{

                            echo "Contents of $vvvkey \n";
                            foreach($vvvval as $vvvvkey => $vvvvval){

                                echo "$vvvvkey: $vvvvval \n";
                            }
                        }
                    }
                }
            }
        }
    }
}

【讨论】:

  • 非常感谢,这很有帮助。从这里我可以对键和值进行操作。对于其他可能想从中学习的人,在我的问题中我并没有强调 ("data") 作为一个数组,我只是按字面意思使用它,而不用引号括起来。所以我发现很难使用@Toby Harris 的答案,因为他使用了“headers_fields”而不是“data”..lol 我的错......嘿,如果你稍后找到的话;请在您的答案中将“headers_field”编辑为“data”。非常感谢。
  • 酷,我很高兴能帮上忙。正如我所说 - 它是构建更优雅的东西的基础。我已经编辑了我的代码以包含数据键。我测试了它,它确实有效。祝你的项目好运!
  • 是的,递归会更简洁,因此也更优雅。
最近更新 更多