为什么我写的这个PHP递归遍历多维数组的函数无法正常工作?
问题原因
- PHP函数参数默认采用传值传递规则,递归调用
LOP($fieldValue, $txt)时传入的是当前$txt变量的副本,递归内部对$txt的修改仅作用于局部作用域,无法回传到上层函数的$txt变量中。 - 现有代码没有接收递归调用的返回值,深层遍历生成的文本内容没有被追加到当前层级的拼接结果里,最终只能返回第一级非数组节点的拼接内容。
修复方案
方案一:接收递归返回值(无副作用,推荐)
修改递归调用行,将递归生成的内容追加到当前$txt变量即可,无需改动其他逻辑:
function LOP($arrayItself, $txt){ foreach($arrayItself as $fieldName=>$fieldValue){ if(is_array($fieldValue)){ // 接收递归返回的内容,追加到当前拼接结果 $txt = LOP($fieldValue, $txt); } else { $txt .= "<$fieldName> $fieldValue </$fieldName>"; } } return $txt; }
方案二:引用传递$txt参数
给$txt参数加上引用标记&,让所有层级的函数操作都指向同一个文本变量:
function LOP($arrayItself, &$txt){ foreach($arrayItself as $fieldName=>$fieldValue){ if(is_array($fieldValue)){ LOP($fieldValue, $txt); } else { $txt .= "<$fieldName> $fieldValue </$fieldName>"; } } return $txt; }
注意:该方案会直接修改外部传入的
$txt原始变量,如果不希望影响外部变量优先选择方案一。
内容的提问来源于stack exchange,提问作者Hamlet Kraskian
相关产品推荐
相关产品推荐

