PHP遍历JSON多维数组提取expiry数据失败,求解决方法
解决PHP遍历JSON多维数组(含混合类型字段)的问题
问题核心
现有代码仅处理了list数组的第一个元素,且未适配expiry字段既为数组又为单个对象的混合类型情况,导致数据提取不全。需要遍历全部list条目,并统一处理expiry的两种类型。
最终解决方案代码
// 读取JSON文件并解析为对象 $json_data = json_decode(file_get_contents('data.json')); // 遍历list中的每一条数据 foreach ($json_data->list as $index => $item) { // 输出Modal与Variation(匹配期望的加粗格式) echo '<tr><td><strong>Modal</strong></td><td><strong>' . $item->mode . '</strong></td></tr>'; echo '<tr><td><strong>Variation</strong></td><td><strong>' . $item->change . '</strong></td></tr>'; // 统一expiry格式:单个对象转为数组,确保遍历逻辑一致 $expiryItems = is_array($item->expiry) ? $item->expiry : [$item->expiry]; // 遍历所有expiry数据 foreach ($expiryItems as $expiry) { echo '<tr><td>Due date</td><td>' . $expiry->cdexpiry . '</td></tr>'; echo '<tr><td>Value</td><td>' . $expiry->vlexpiry . '</td></tr>'; } // 非最后一条数据时输出分隔线 if ($index < count($json_data->list) - 1) { echo '<tr><td><strong>---</strong></td><td><strong>---</strong></td></tr>'; } }
代码关键说明
- 全量遍历list:通过
foreach循环覆盖list数组的所有条目,避免仅处理第一个元素的问题 - 统一类型处理:用
is_array()判断expiry类型,将单个对象转为包含该对象的数组,让后续遍历逻辑无需区分类型 - 格式匹配期望输出:按照需求的HTML表格行格式输出内容,加粗关键字段
- 分隔线控制:仅在非末尾条目后添加分隔线,避免多余的尾部分隔
对应期望输出(表格格式)
| Type | Value |
|---|---|
| Modal | 0401 |
| Variation | N |
| Due date | v130 |
| Value | 33528.99 |
| Due date | v230 |
| Value | 21648.39 |
| Due date | v150 |
| Value | 185350.30 |
| --- | --- |
| Modal | 1904 |
| Variation | N |
| Due date | v40 |
| Value | 1091.46 |
| --- | --- |
| Modal | 1904 |
| Variation | N |
| Due date | v770 |
| Value | 1001.56 |
| --- | --- |
| Modal | 0213 |
| Variation | N |
| Due date | v130 |
| Value | 2084.08 |
| Due date | v260 |
| Value | 28362.31 |
| --- | --- |
| Modal | 0101 |
| Variation | N |
| Due date | v210 |
| Value | 296.78 |
| --- | --- |
| Modal | 0217 |
| Variation | N |
| Due date | v245 |
| Value | 1495.37 |
| Due date | v248 |
| Value | 1440.37 |
内容的提问来源于stack exchange,提问作者Dutt
相关产品推荐
相关产品推荐

