将实现 Iterator 的 PHP 类视为数组

2023-04-10php开发问题
16

本文介绍了将实现 Iterator 的 PHP 类视为数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

如果我有一个实现 Iterator 接口的类,我可以手动控制 foreach 循环中的迭代方式.但是还有其他方法可以让我的对象表现得像一个数组吗?

If I have a class that implements the Iterator interface, I can manually control how iteration in a foreach loop. But are there other ways in which I could make my object behave like an array?

例如,假设我有一个实现 Iterator 的类 Guestbook,这样我就可以迭代 foreach (new Guestbook() as $entry).但是,如果我想颠倒顺序怎么办?

For instance, let's say I have a class Guestbook which implements Iterator, so that I can iterate foreach (new Guestbook() as $entry). But what if I want to, say, reverse the order?

foreach (array_reverse(new Guestbook()) as $entry) 肯定不行,因为 array_reverse 只接受一个数组.

foreach (array_reverse(new Guestbook()) as $entry) definitely won't work, because array_reverse will only accept an array.

我想我想问的是,我可以将 Iterator 用于更多的 foreach 循环吗?

I guess what I'm asking is, can I use Iterator for more than just foreach loops?

谢谢.

推荐答案

迭代器接口的目的 是为了让你的对象在 foreach 循环中使用,它不是为了让你的对象像一个数组.如果您想要一些像数组一样的东西,请使用数组.

The purpose of the Iterator interface is to allow your object to be used in a foreach loop, it is not intended to make your object act like an array. If you want something that acts like an array, use an array.

您始终可以使用iterator_to_array 函数将您的对象转换为数组,但您无法逆转该过程.

You can always turn your object into an array by using the iterator_to_array function, but you can't reverse that process.

如果您认为需要反转可迭代对象中元素的顺序,那么您可以创建一个 reverse() 方法,该方法可能在内部使用 array_reverse().像这样:-

If you see the need for reversing the order of the elements in your iterable object, then you could create a reverse() method that, possibly, uses array_reverse() internally. Something like this:-

class Test implements Iterator
{
    private $testing = [0,1,2,3,4,5,6,7,8,9,10];
    private $index = 0;

    public function current()
    {
        return $this->testing[$this->index];
    }

    public function next()
    {
        $this->index ++;
    }

    public function key()
    {
        return $this->index;
    }

    public function valid()
    {
        return isset($this->testing[$this->key()]);
    }

    public function rewind()
    {
        $this->index = 0;
    }

    public function reverse()
    {
        $this->testing = array_reverse($this->testing);
        $this->rewind();
    }
}

$tests = new Test();
var_dump(iterator_to_array($tests));
$tests->reverse();
var_dump(iterator_to_array($tests));

输出:-

array (size=11)
  0 => int 0
  1 => int 1
  2 => int 2
  3 => int 3
  4 => int 4
  5 => int 5
  6 => int 6
  7 => int 7
  8 => int 8
  9 => int 9
  10 => int 10

array (size=11)
  0 => int 10
  1 => int 9
  2 => int 8
  3 => int 7
  4 => int 6
  5 => int 5
  6 => int 4
  7 => int 3
  8 => int 2
  9 => int 1
  10 => int 0

我写了代码是为了在发布之前向自己证明它可以工作,并认为我不妨把它扔到答案中.

I wrote the code to prove to myself that it would work before posting and thought I might as well throw it into the answer.

这篇关于将实现 Iterator 的 PHP 类视为数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End

相关推荐

PHP实现DeepL翻译API调用
DeepL的翻译效果还是很强大的,如果我们要用php实现DeepL翻译调用,该怎么办呢?以下是代码示例,希望能够帮到需要的朋友。 在这里需要注意,这个DeepL的账户和api申请比较难,不支持中国大陆申请,需要拥有香港或者海外信用卡才行,没账号的话,目前某宝可以...
2025-08-20 php开发问题
168

PHP通过phpspreadsheet导入Excel日期数据处理方法
PHP通过phpspreadsheet导入Excel日期,导入系统后,全部变为了4开头的几位数字,这是为什么呢?原因很简单,将Excel的时间设置问文本,我们就能看到该日期本来的数值,上图对应的数值为: 要怎么解决呢?进行数据转换就行,这里可以封装方法,或者用第三方的...
2024-10-23 php开发问题
287

mediatemple - 无法使用 codeigniter 发送电子邮件
mediatemple - can#39;t send email using codeigniter(mediatemple - 无法使用 codeigniter 发送电子邮件)...
2024-08-23 php开发问题
11

Laravel Gmail 配置错误
Laravel Gmail Configuration Error(Laravel Gmail 配置错误)...
2024-08-23 php开发问题
16

将 PHPMailer 用于 SMTP 的问题
Problem with using PHPMailer for SMTP(将 PHPMailer 用于 SMTP 的问题)...
2024-08-23 php开发问题
4

关于如何在 GoDaddy 服务器中使用 PHPMailer 设置 SMTP 的问题
Issue on how to setup SMTP using PHPMailer in GoDaddy server(关于如何在 GoDaddy 服务器中使用 PHPMailer 设置 SMTP 的问题)...
2024-08-23 php开发问题
17