PHP Iterator 是否仅支持数值数组?如何实现关联数组遍历?
问题根因
你遇到的问题是原有实现的两个设计缺陷导致的:
- 构造函数调用了
array_values()处理传入的数组:该函数会直接清除数组所有自定义键名,将数组重置为从0开始的连续数字索引,你传入的关联数组键a、b、c在存入类属性的时候就已经被丢弃。 key()方法直接返回内部数值指针$pointer:该实现没有读取原数组的真实键名,永远返回数字类型的指针偏移值,就算没有array_values()的处理也无法返回关联键。
修改方案
调整类的实现逻辑,保留原始数组的键值对应关系即可同时支持索引数组和关联数组遍历,修改后的完整代码如下:
<?php class MyIterator implements Iterator { private $items = []; // 单独存储原始数组的所有键名 private $keys = []; private $pointer = 0; public function __construct($items) { // 直接存储原始数组,不重置索引 $this->items = $items; // 提取所有原始键名,和元素顺序一一对应 $this->keys = array_keys($items); } public function current() { // 用当前指针匹配对应的原始键,再读取对应值 return $this->items[$this->keys[$this->pointer]]; } public function key() { // 返回当前指针对应的原始键名 return $this->keys[$this->pointer]; } public function next() { $this->pointer++; } public function rewind() { $this->pointer = 0; } public function valid() { // 指针小于键列表总长度即为有效位置 return $this->pointer < count($this->keys); } } // 测试代码 function printIterable(iterable $myIterable) { foreach($myIterable as $item => $value) { // 拼接换行符方便查看结果,可根据需求调整 echo "$item - $value\n"; } } $iterator = new MyIterator(["a"=>1, "b"=>2, "c"=>3]); printIterable($iterator); // 输出结果: // a - 1 // b - 2 // c - 3 ?>
修改后实现同时兼容索引数组和关联数组的遍历,能完整保留原始键名。
内容的提问来源于stack exchange,提问作者NameDoesNotExist
相关产品推荐
相关产品推荐

