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,提供一些叫做封装的东西.
PHP 中的数组实际上是一个有序映射。映射是将值与键关联起来的类型。该类型针对多种不同用途进行了优化;它可以被视为数组、列表(向量)、哈希表(映射的实现)、字典、集合、堆栈、队列等。由于数组值可以是其他数组,因此树和多维数组也是可能的。
此类允许对象作为数组工作。
该迭代器允许在迭代数组和对象时取消设置和修改值和键。
当您想要多次迭代同一个数组时,您需要实例化 ArrayObject 并让它创建通过使用 foreach 或手动调用其 getIterator() 方法引用它的 ArrayIterator 实例。
| 归档时间: |
|
| 查看次数: |
15307 次 |
| 最近记录: |