PHP遍历数组无法正确比对键值 跳过id键输出作者信息问题
问题场景
我正在使用foreach遍历包含多个键的数组,以打印输出作者信息,初始编写的代码如下:
foreach($data as $authors) { foreach($authors as $id){ foreach($id as $key){ if($key !== $key['id']) echo $key . '-'; } } }
实现目标:遍历过程中若遇到键名为id的字段则不输出,仅输出姓名、邮箱、出生年份这三类作者信息。
项目完整代码结构如下:
$data = [ 'authors' => [ 301 => [ 'id' => 301, 'name' => 'William Shakespeare', 'email' => 'william_shakespeare@example.com', 'birthYear' => 1799, ], 10 => [ 'id' => 10, 'name' => 'Jack London', 'email' => 'jack_london@example.com', 'birthYear' => 1809, ], 17 => [ 'id' => 17, 'name' => 'Mikhail Lermontov', 'email' => 'mikhail_lermontov@example.com', 'birthYear' => 1814, ], ], ]; echo '=== Authors ===<br>'; foreach($data as $authors) { foreach($authors as $id){ foreach($id as $key){ if($key !== $key['id']) echo $key; } } }
代码问题说明
- 遍历层级冗余:数组实际结构为
$data['authors']存储所有作者条目,每条作者信息是包含id、name等字段的一维数组,现有三层foreach属于多余嵌套,两层遍历即可覆盖所有需要的内容 - 判断逻辑失效:现有判断
if($key !== $key['id'])未获取遍历过程中的字段键名,仅拿元素值和值本身的'id'下标做对比,完全无法实现「跳过id字段」的需求
修正方案
遍历单个作者的信息数组时,同时获取字段键名和对应值,判断键名不是id时再输出内容即可,修正后的代码如下:
echo '=== Authors ===<br>'; // 遍历authors下的所有作者条目 foreach($data['authors'] as $author) { // 遍历单个作者的所有字段,同时拿到字段名和字段值 foreach($author as $field => $value) { // 字段名为id时直接跳过 if($field === 'id') { continue; } // 输出字段值,用-分隔 echo $value . '-'; } // 单个作者信息输出完成后换行 echo '<br>'; }
如果不需要动态判断字段,也可以直接指定要输出的三个字段,用implode拼接,逻辑更稳定:
echo '=== Authors ===<br>'; foreach($data['authors'] as $author) { echo implode('-', [ $author['name'], $author['email'], $author['birthYear'] ]) . '<br>'; }
内容的提问来源于stack exchange,提问作者Roomba
相关产品推荐
相关产品推荐

