You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ArrayObject与iterator_apply报错:闭包参数不足问题求助

ArrayObject使用iterator_apply触发参数错误

以下PHP代码中,ArrayObject的foreach循环可正常执行,但调用iterator_apply并传入闭包时触发错误:

$a = new ArrayObject();
$a['b'] = 10;
foreach ($a as $b) {  // 循环正常执行
    var_dump($b);
}
iterator_apply($a, fn ($x) => var_dump($x));  // 无法正常工作

错误信息:

Fatal error: Uncaught ArgumentCountError: Too few arguments to function {closure}(), 0 passed and exactly 1 expected in /in/DoaHu:8

问题原因

iterator_apply的回调函数默认不会自动传递迭代元素或迭代器本身——如果未指定第三个参数,回调会被传入0个参数,但你的闭包声明要求接收1个参数,因此触发参数数量不匹配的错误。此外,iterator_apply要求回调返回true才能继续迭代,否则循环会提前终止,这也是容易遗漏的细节。

解决方案

调整代码,通过iterator_apply的第三个参数传递迭代器实例,在回调中手动获取当前元素,并返回true维持迭代:

$a = new ArrayObject();
$a['b'] = 10;
foreach ($a as $b) {
    var_dump($b);
}
// 修复后的iterator_apply调用
iterator_apply($a, function($iterator) {
    var_dump($iterator->current()); // 手动获取当前迭代元素
    return true; // 返回true继续下一次迭代
}, [$a]); // 将迭代器作为参数传递给回调

运行这段代码会正常输出int(10),和foreach的执行结果一致。

内容的提问来源于stack exchange,提问作者Olle Härstedt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 17:45:05