PHP嵌套数组按键访问打印报错及表格展示需求
PHP嵌套数组按键访问问题及表格生成解决方案
问题需求
现有一段PHP代码可打印嵌套数组的Incs子数组值,但尝试用echo $subsubsubvalue[$subsubsubkey];按键访问元素时出现错误,需实现正确的按键访问方式,同时将数组数据以「时间 | 球员 | 事件」的表格形式展示。
原有可运行代码
foreach ($summary as $key => $value) { if ($key === "Incs") { foreach ($value as $subkey => $subvalue) { foreach ($subvalue as $subsubkey => $subsubvalue) { echo "$subsubkey:\n"; foreach ($subsubvalue as $subsubsubkey => $subsubsubvalue) { echo $subsubsubvalue; } } } } else { echo "$key: $value\n"; } }
报错的尝试代码
foreach ($summary as $key => $value) { if ($key === "Incs") { foreach ($value as $subkey => $subvalue) { foreach ($subvalue as $subsubkey => $subsubvalue) { echo "$subsubkey:\n"; foreach ($subsubvalue as $subsubsubkey => $subsubsubvalue) { echo $subsubsubvalue[$subsubsubkey]; } } } } else { echo "$key: $value\n"; } }
目标数组结构
array(8) { ["Eid"]=> string(6) "891551" ["Tr1"]=> string(1) "2" ["Tr2"]=> string(1) "0" ["Trh1"]=> string(1) "2" ["Trh2"]=> string(1) "0" ["Tr1OR"]=> string(1) "0" ["Tr2OR"]=> string(1) "0" ["Incs"]=> array(1) { [1]=> array(2) { [0]=> array(12) { ["Min"]=> int(24) ["Nm"]=> int(1) ["Aid"]=> string(5) "57092" ["ID"]=> string(5) "57092" ["Fn"]=> string(7) "Si-heon" ["Ln"]=> string(3) "Lee" ["Pnum"]=> int(0) ["Pn"]=> string(11) "Si-Heon Lee" ["PnumO"]=> int(0) ["IT"]=> int(36) ["Sc"]=> array(2) { [0]=> int(1) [1]=> int(0) } ["Sor"]=> int(3) } [1]=> array(9) { ["Min"]=> int(32) ["Nm"]=> int(1) ["ID"]=> string(7) "1067481" ["Pnum"]=> int(0) ["Pn"]=> string(13) "Dong-Ryul Lee" ["PnumO"]=> int(0) ["IT"]=> int(36) ["Sc"]=> array(2) { [0]=> int(2) [1]=> int(0) } ["Sor"]=> int(5) } } } }
期望表格样式
| 时间 | 球员 | 事件 |
|---|---|---|
| 36' | Debryne | Goal |
| 45' | Martial | Yellow card |
解决方案
1. 修复按键访问错误
报错原因:最内层循环中,$subsubsubvalue已经是数组的元素值(比如Min对应的24、Pn对应的球员名),而非数组,此时用$subsubsubvalue[$subsubsubkey]相当于用标量值作为数组访问,必然触发错误。
正确的按键访问方式是直接操作$subsubvalue数组,根据键名获取对应值:
foreach ($summary as $key => $value) { if ($key === "Incs") { foreach ($value as $subkey => $subvalue) { foreach ($subvalue as $subsubkey => $subsubvalue) { echo "事件详情:\n"; // 直接按键名访问元素 echo "时间: {$subsubvalue['Min']}'\n"; echo "球员: {$subsubvalue['Pn']}\n"; // 根据Sc和IT字段映射事件类型,示例逻辑 $event = match(true) { $subsubvalue['IT'] === 36 && $subsubvalue['Sc'][0] === 1 => "Goal", $subsubvalue['IT'] === 36 && $subsubvalue['Sc'][0] === 2 => "Assist", default => "Unknown Event" }; echo "事件: $event\n\n"; } } } else { echo "$key: $value\n"; } }
2. 生成目标表格
结合数组结构,提取对应字段并生成Markdown表格:
// 初始化表格头部 echo "| 时间 | 球员 | 事件 |\n"; echo "|------|------|------|\n"; foreach ($summary['Incs'] as $subvalue) { foreach ($subvalue as $eventItem) { // 处理时间格式 $time = "{$eventItem['Min']}'"; // 获取球员名 $player = $eventItem['Pn']; // 映射事件类型(根据实际业务逻辑调整) $event = match(true) { $eventItem['IT'] === 36 && $eventItem['Sc'][0] === 1 => "Goal", $eventItem['IT'] === 36 && $eventItem['Sc'][0] === 2 => "Assist", default => "Unknown" }; // 输出表格行 echo "| $time | $player | $event |\n"; } }
运行上述代码后,会输出符合要求的表格:
| 时间 | 球员 | 事件 |
|---|---|---|
| 24' | Si-Heon Lee | Goal |
| 32' | Dong-Ryul Lee | Assist |
内容的提问来源于stack exchange,提问作者Eng Sibo Dams
相关产品推荐
相关产品推荐

