如何检测PHP数组是否为递归数组及遍历中的递归识别方法
PHP递归数组判断及遍历识别方案
判断数组是否为递归数组
PHP没有内置专门检测递归数组的函数,可以通过以下两种常用方案实现:
- 利用内置函数
var_export的递归检测特性var_export会输出合法的PHP代码,遇到递归引用结构时会抛出携带recursion关键词的警告,我们可以捕获这个警告实现检测,适配性更高:
function is_recursive_array(array $arr): bool { $hasRecursion = false; // 临时设置错误处理器捕获递归警告 set_error_handler(function ($errno) use (&$hasRecursion) { if ($errno === E_WARNING && strpos(error_get_last()['message'], 'recursion') !== false) { $hasRecursion = true; } return true; }); // 第二个参数设为true表示返回输出内容不直接打印 var_export($arr, true); restore_error_handler(); return $hasRecursion; }
测试示例:
$a = ['value', &$a]; var_dump(is_recursive_array($a)); // 输出 bool(true)
- 自定义递归标记检测
通过记录已访问的数组唯一标识比对,适合需要自定义检测逻辑的场景:
function is_recursive_array(array $array, array &$visited = []): bool { // 将数组转为临时对象获取唯一哈希标识 $hash = spl_object_hash((object)$array); if (in_array($hash, $visited)) { return true; } $visited[] = $hash; foreach ($array as $value) { if (is_array($value) && is_recursive_array($value, $visited)) { return true; } } // 退出当前层级时移除标记,避免误判不同分支的独立数组 array_pop($visited); return false; }
遍历递归数组时识别递归结构
遍历的核心逻辑是维护一个已访问数组的标识集合,每次遇到数组类型的元素时先做重复校验,识别到递归结构时可以按需做标记、跳过等处理,示例代码如下:
function traverse_array(array $array, array &$visited = [], int $depth = 0) { $prefix = str_repeat(' ', $depth); $currentHash = spl_object_hash((object)$array); // 识别到递归引用 if (in_array($currentHash, $visited)) { echo $prefix . "*递归引用,终止遍历当前分支*\n"; return; } $visited[] = $currentHash; foreach ($array as $key => $val) { if (is_array($val)) { echo "{$prefix}{$key} => Array(\n"; traverse_array($val, $visited, $depth + 1); echo "{$prefix})\n"; } else { echo "{$prefix}{$key} => " . var_export($val, true) . "\n"; } } array_pop($visited); }
测试示例输出:
0 => 'value' 1 => Array( *递归引用,终止遍历当前分支* )
内容的提问来源于stack exchange,提问作者Richi RM
相关产品推荐
相关产品推荐

