【问题标题】:Loop in nested json array PHP在嵌套的 json 数组 PHP 中循环
【发布时间】:2018-11-18 13:51:15
【问题描述】:

通过邮寄方式接收的 json 字符串示例如下:

[
  {
    "gc": [
      {
        "id": "1",
        "ti": "title1",
        "oid": 1,
        "mid": "1-2",
        "mc": 2,
        "gct": 1,
        "ma": 1,
        "isu": 0
      }
    ],
    "gcm": [
      {
        "mid": "11",
        "gcid":"1",
        "sid": 58,
        "msg": "msg1 ",
        "sdt": "2018-11-12T13:58:24.627",
        "ma": 20181112135822,
        "isu": 0
      },
      {
        "mid": "12",
        "gcid":"1",
        "sid": 58,
        "msg": "msg2 ",
        "sdt": "2018-11-12T13:58:24.627",
        "ma": 20181112135822,
        "isu": 0
      }
    ],
    "gcms": [
      {
        "id": "111",
        "ma": 1,
        "mid": 58,
        "sdt": "1",
        "isu": 0,
        "msf": 0,
        "gcid": "1",
        "cmid": "11"
      },
      {
        "id": "112",
        "ma": 1,
        "mid": 58,
        "sdt": "1",
        "isu": 0,
        "msf": 0,
        "gcid": "1",
        "cmid": "11"
      },
      {
        "id": "121",
        "ma": 1,
        "mid": 58,
        "sdt": "1",
        "isu": 0,
        "msf": 0,
        "gcid": "1",
        "cmid": "12"
      },
      {
        "id": "122",
        "ma": 1,
        "mid": 58,
        "sdt": "1",
        "isu": 0,
        "msf": 0,
        "gcid": "1",
        "cmid": "12"
      }
    ]
  }
]

我使用下面的代码在解码后的数组中循环,但只在数组中循环 1 次:

$json  = json_decode($input, true);
foreach ($json as $value) {
    $this->logger->info("Start update_new_data ->");
    if (isset($value['gc'])) {
        $this->logger->info("gc key exist");
        foreach ($value["gc"] as $jObj) {
        }
    } else {
        if (isset($value['gcm'])) {
            $this->logger->info("gcm key exist");
            foreach ($value["gcm"] as $jObj) {
            }
        } else {
            if (isset($value['gcms'])) {
                $this->logger->info("gcms key exist");
                foreach ($value["gcms"] as $jObj) {
                }
            }
        }
    }
    $this->logger->info("End update_new_data ->");
}

我想在数组中循环,如果键是“gc”数组中的“gc”循环并再次循环,如果键是“gcm”数组中的“gcm”循环,如果键是“gcms”数组中的“gcms”循环.我必须检查密钥,因为 json 字符串中不存在密钥 mybe。 测试许多代码但不能解决问题。 我该怎么做?

【问题讨论】:

  • 你可以使用if ..elseif...elseif...elsearray_keys

标签: php arrays json multidimensional-array


【解决方案1】:

@mohammadi 这可以为你工作。

$json  = json_decode($input, true);
$json = isset($json[0])?$json[0]:'';
$this->logger->info("Start update_new_data ->");
if(!empty($json)){
foreach ($json as $Key=>$value) {
if(isset($Key)){
if ($Key == "gc") {
    $this->logger->info("gc key exist");
    foreach ($value as $jObj) {
    }
} 
else if ($Key == "gcm") {
    $this->logger->info("gcm key exist");
    foreach ($value as $jObj) {
    }
}
else if ($Key == "gcms") {
     $this->logger->info("gcms key exist");
     foreach ($value as $jObj) {
     }
}
}
$this->logger->info("End update_new_data ->");
}
}

如果你不想因为整个 json 日期(数组)而改变 json 结构,你可以使用这个 "$json = isset($json[0])?$json[0]:'';" 行在单个数组中,因此您可以获得数组的第一个索引。如果您像这样更改 json(如下所示),那么您不需要此 "$json = isset($json[0])?$json[0]:'';"

$input = '{  
    "gc": [
      {
        "id": "1",
        "ti": "title1",
        "oid": 1,
        "mid": "1-2",
        "mc": 2,
        "gct": 1,
        "ma": 1,
        "isu": 0
      }
    ],
    "gcm": [
      {
        "mid": "11",
        "gcid":"1",
        "sid": 58,
        "msg": "msg1 ",
        "sdt": "2018-11-12T13:58:24.627",
        "ma": 20181112135822,
        "isu": 0
      },
      {
        "mid": "12",
        "gcid":"1",
        "sid": 58,
        "msg": "msg2 ",
        "sdt": "2018-11-12T13:58:24.627",
        "ma": 20181112135822,
        "isu": 0
      }
    ],
    "gcms": [
      {
        "id": "111",
        "ma": 1,
        "mid": 58,
        "sdt": "1",
        "isu": 0,
        "msf": 0,
        "gcid": "1",
        "cmid": "11"
      },
      {
        "id": "112",
        "ma": 1,
        "mid": 58,
        "sdt": "1",
        "isu": 0,
        "msf": 0,
        "gcid": "1",
        "cmid": "11"
      },
      {
        "id": "121",
        "ma": 1,
        "mid": 58,
        "sdt": "1",
        "isu": 0,
        "msf": 0,
        "gcid": "1",
        "cmid": "12"
      },
      {
        "id": "122",
        "ma": 1,
        "mid": 58,
        "sdt": "1",
        "isu": 0,
        "msf": 0,
        "gcid": "1",
        "cmid": "12"
      }
    ]
  }';

【讨论】:

    【解决方案2】:

    根据问题中给出的 json,解码后的数组具有包含所有元素的单个元素。在这种情况下,不要循环遍历$json like:foreach ($json..,而是尝试循环遍历$json[0] like:foreach ($json[0]... 并且要获取密钥,您不必使用array_keys,只需使用类似的密钥运行循环:foreach ($json[0] as $key => $value)...

    【讨论】:

      【解决方案3】:

      我看不出有任何理由为外部数组使用循环。只需直接访问您想要的部分:

      $json  = json_decode($input, true);
      $value = $json[0];
      $this->logger->info("Start update_new_data ->");
      if (isset($value['gc'])) {
          $this->logger->info("gc key exist");
          foreach ($value["gc"] as $jObj) {
          }
      } 
      if (isset($value['gcm'])) {
          $this->logger->info("gcm key exist");
          foreach ($value["gcm"] as $jObj) {
          }
      }
      if (isset($value['gcms'])) {
           $this->logger->info("gcms key exist");
           foreach ($value["gcms"] as $jObj) {
           }
      }
      $this->logger->info("End update_new_data ->");
      

      这样你可以更清楚地看到你的 json 结构(数组中的数组)。

      【讨论】:

      • 我必须在数组中循环
      【解决方案4】:

      尝试使用array_keys 进行迭代:

      $json  = json_decode($input, true);
      $json_keys = array_keys($json);
      foreach ($json_keys as $json_key) {
          $item = $json[$json_key];
          foreach ($item as $row) {
              foreach ($row as $subrow) {
                  echo isset($subrow['id']) ? $subrow['id'] : 'nope';
              }
          }
      }
      

      【讨论】:

      • 谢谢,我用这个,但是在foreach中无法获取$row值,$id = $row['id'];
      • gc 也是数组,因此您无法获得 $row['id'] 值。我根据您的需要更改了代码示例
      猜你喜欢
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多