PHP递归函数二次调用返回空JSON对象问题求助
解决PHP递归函数返回空JSON对象的问题
我之前写递归逻辑时也踩过一模一样的坑!你说的这种“二次调用逻辑全正常但返回空{}”的情况,几乎可以肯定是递归调用时没有把返回值向上传递导致的——这是PHP递归里最容易忽略的细节之一。
问题根源分析
结合你描述的场景,你的简化代码大概率是类似这样的:
public function run() { $result = null; // 这里的其他逻辑都正常执行,包括二次调用时 // ... // 满足递归条件时触发二次调用 if (/* 递归触发条件 */) { // 错误:只执行了递归调用,但没把返回值赋值给当前层级的$result $this->run(); } else { // 终止条件下组装正常结果 $result = ['data' => 'some value']; } return json_encode($result); }
当进入递归分支时,你只是执行了$this->run(),但没有把这个递归调用的返回值赋值给当前层级的$result。所以当前层级的$result还是初始的null,转成JSON自然就是空对象{}——哪怕递归内部的逻辑已经正确生成了数据,也没传递到外层。
修复方案
只需要在递归调用时,把返回值赋值给当前层级的$result即可:
public function run() { $result = null; // 其他正常逻辑 // ... if (/* 递归触发条件 */) { // 关键:将递归调用的返回值传递给当前$result $result = $this->run(); } else { // 终止条件组装数据 $result = ['data' => 'some value']; } // 建议:如果后续统一转JSON,可以在这里返回数组,调用时再编码 // return $result; // 或者保持原逻辑直接返回JSON字符串 return json_encode($result); }
其他可能的排查点
如果上面的修复没解决问题,可以再检查这两个地方:
- 递归终止条件是否正确:确认二次调用时确实会触发终止逻辑,不会陷入无限递归(不过你说逻辑正常执行,这个概率较低)
- 数据组装是否有问题:在递归的终止分支里,用
var_dump()输出一下$result,确认数据确实被正确组装了,而不是意外变成了空数组/对象
内容的提问来源于stack exchange,提问作者Edwin Krause
相关产品推荐
相关产品推荐

