PHP中ArrayIterator,ArrayObject和Array之间的区别

jkh*_*ler 27 php arrays arrayiterator arrayobject

有人可以解释清楚的根本差异ArrayIterator,ArrayObject以及在阵列中的PHP的功能和操作方面?谢谢!

小智 28

Array是一种原生的php类型.你可以使用php语言结构创建一个array(),或者从php 5.4开始[]

ArrayObject是一个object完全像数组的工作.这些可以使用new关键字创建

ArrayIterator就像ArrayObject它可以迭代自己.也使用创建new


比较Arrayvs(ArrayObject/ ArrayIterator)

它们都可以使用php的数组语法来使用,例如.

$array[] = 'foo';
$object[] = 'foo';
// adds new element with the expected numeric key

$array['bar'] = 'foo';
$object['bar'] = 'foo';
// adds new element with the key "bar"

foreach($array as $value);
foreach($object as $value);
// iterating over the elements
Run Code Online (Sandbox Code Playgroud)

但是,它们仍然是对象与数组,因此您会注意到它们之间的差异

is_array($array); // true
is_array($object); // false

is_object($array); // false
is_object($object); // true
Run Code Online (Sandbox Code Playgroud)

大多数php数组函数都需要数组,因此使用对象会产生错误.有很多这样的功能.例如.

sort($array); // works as expected
sort($object); // Warning: sort() expects parameter 1 to be array, object given in ......
Run Code Online (Sandbox Code Playgroud)

最后,对象可以执行您对stdClass对象的期望,即使用对象语法访问公共属性

$object->foo = 'bar'; // works
$array->foo = 'bar'; // Warning: Attempt to assign property of non-object in ....
Run Code Online (Sandbox Code Playgroud)

数组(作为本机类型)比对象快得多.另一方面,ArrayObject&ArrayIteratorclasses定义了一些你可以使用的方法,而数组则没有


比较ArrayObject对比ArrayIterator

这两者之间的主要区别在于类的方法.

ArrayIterator工具Iterator界面,使得它相关的方法进行迭代/遍历的元素.ArrayObject有一个叫做的方法exchangeArray,用另一个方法交换它的内部数组.实现类似的东西ArrayIterator意味着要么创建一个新对象,要么unset逐个循环键入所有这些对象,然后逐个设置新数组中的元素.

接下来,由于ArrayObject无法迭代,因此当您在foreach其中使用它时,会在ArrayIterator内部创建一个对象(与数组相同).这意味着php会创建原始数据的副本,现在有2个具有相同内容的对象.对于大型阵列来说,这将被证明是低效的.但是,您可以指定要用于迭代器的类,因此您可以在代码中使用自定义迭代器.


希望这是有帮助的.欢迎编辑这个答案.


Dav*_*vid 10

ArrayObject和数组有些相似.仅仅是对象(或本机类型)的集合.他们有一些你可以调用的不同方法,但它主要归结为同样的事情.

然而,迭代器完全是另一回事.迭代器设计模式是一种保护数组的方法(使其只能读取).让我们来看下一个例子:

你有一个有数组的类.您可以使用addSomethingToMyArray将项添加到该数组.但是请注意,在我们将它实际添加到数组之前,我们会对项目执行某些操作.这可能是任何事情,但是暂时让我们想要添加到数组的每个项目触发此方法非常重要.

class A
{
    private $myArray;
    public function returnMyArray()
    {
        return $this->myArray;
    }

    public function addSomethingToMyArray( $item )
    {
        $this->doSomethingToItem( $item ); 
        array_push( $item );
    }
}
Run Code Online (Sandbox Code Playgroud)

这个问题是你在这里通过引用传递数组.这意味着实际使用returnMyArray的类将获得真正的myArray对象.这意味着除了A之外的类可以向该数组添加内容,因此也可以更改A中的数组,而无需使用addSOmethingToMyArray.但是我们需要做SOmethingToItem,还记得吗?这是一个不控制自己内在状态的类的例子.

解决方案是迭代器.我们将数组传递给一个新对象,而不是传递数组,该对象只能从数组中读取东西.最简单的Iterator就是这样的:

<?php

class MyIterator{

    private $array;
    private $index;

    public function __construct( $array )
    {
        $this->array = $array;
    }

    public function hasNext()
    {
        return count( $this->array ) > $this->index;
    }

    public function next()
    {
        $item = $this->array[ $this->index ];
        this->$index++;

        return $item;
    }       
}
Run Code Online (Sandbox Code Playgroud)

?>

正如您所看到的,我无法向给定数组添加新项目,但我确实有可能像这样读取数组:

while( $iterator->hasNext() )
    $item = $iterator->next();
Run Code Online (Sandbox Code Playgroud)

现在又有一种方法可以将项添加到A中的myArray,即通过addSomethingToArray方法.所以这就是Iterator,它有点像数组的shell,提供一些叫做封装的东西.


Nav*_*eed 0

PHP 中的数组实际上是一个有序映射。映射是将值与键关联起来的类型。该类型针对多种不同用途进行了优化;它可以被视为数组、列表(向量)、哈希表(映射的实现)、字典、集合、堆栈、队列等。由于数组值可以是其他数组,因此树和多维数组也是可能的。

此类允许对象作为数组工作。

该迭代器允许在迭代数组和对象时取消设置和修改值和键。

当您想要多次迭代同一个数组时,您需要实例化 ArrayObject 并让它创建通过使用 foreach 或手动调用其 getIterator() 方法引用它的 ArrayIterator 实例。

  • 抱歉,我没有说清楚我的问题 - 是的,我已经阅读了关于这三个的 PHP 文档,但在我看来,它们做的事情几乎相同。我想知道是否有人可以解释它们之间的实际区别以及为什么您会选择其中一个而不是另一个。如果这不是一个适合在这里发布的问题,那么我深表歉意,并请随时删除这篇文章! (15认同)