PHP多级数组中能否用变量简化层级命名与访问?
解决PHP数组层级变量替代的问题
首先看你原来的代码,问题出在$many = ['b']['c'];这一行,这种写法是错误的——['b']是一个仅包含键'b'的数组,后面加['c']会尝试读取这个数组的'c'元素,结果是null,所以这个变量根本没存下你想要的层级路径。
下面给你几种可行的实现方式,满足你用变量替代重复层级的需求:
方法1:用数组存储路径,循环遍历取值
把要跳过的层级存在一个数组里,然后从固定的起始节点开始遍历这个路径,最后再取固定的结尾键:
<?php $array['a']['b']['c']['d'] = "foo"; // 把需要的层级路径存在数组里 $path = ['b', 'c']; // 从固定的起始节点开始 $current = &$array['a']; foreach ($path as $key) { $current = &$current[$key]; } // 最后取固定的'd'键 echo $current['d']; // 输出foo ?>
方法2:用array_reduce简化遍历逻辑
PHP 7及以上可以用array_reduce来简化遍历逻辑,代码更紧凑:
<?php $array['a']['b']['c']['d'] = "foo"; $path = ['b', 'c']; // 从$array['a']开始,依次遍历路径中的键 $current = array_reduce($path, function($carry, $key) { return $carry[$key]; }, $array['a']); echo $current['d']; // 输出foo ?>
方法3:用引用直接定位目标层级(支持修改)
如果需要修改该层级的内容,用引用会更方便,修改后原数组会同步更新:
<?php $array['a']['b']['c']['d'] = "foo"; $path = ['b', 'c']; $current = &$array['a']; foreach ($path as $key) { $current = &$current[$key]; } // 不仅可以取值,还能修改原数组内容 $current['d'] = "bar"; echo $array['a']['b']['c']['d']; // 输出bar ?>
针对你实际需求里的['a']['children']['b']['children']['c']['d']场景,只需要把$path改成['children', 'b', 'children', 'c'],从$array['a']开始遍历后取['d']即可,完全避免重复书写长层级。
内容的提问来源于stack exchange,提问作者Mario Boulanger
相关产品推荐
相关产品推荐

