PHP数组本质的结构是HashTable,HashTable既具有双向链表的优点,同时具有能与数组匹敌的操作性能。HashTable是PHP内核实现的基础,用户定义的变量、函数、类,以及资源等容器都是通过HashTable去实现的。在ZendEngine中HashTable的元素其实是一个指针,使得HashTable能包容各种数据类型。
1.PHP的数组类型
1)索引数组
索引数组的索引值是整数,以0开始,如array('d','da','p');
2)关联数组
关联数组以字符串作为索引值,如array('a'=>'d','b'=>'da','c'=>'p');
3)混合数组
混合数组,兼有以上两种类型,如array('d','b'=>'da','c'=>'p');
2.foreach
foreach函数的语法如下:
foreach($arr as $key => $val)
{
echo "The value of $key is: $val\n";
}
接下来,解析一下foreach的机制。开始执行前,数组内部的指针会自动设置为指向第一个单元,每次循环的时候,将数组的键/值复制到$key/$value,数组内部指针指向下一个单元。由于foreach是数组内部指针操作,比使用for循环效率要高。但是,这也并非绝对的,就是复制$key/$value变量的消耗过大的时候,一般是自定义类,且定义了复杂的__clone方法,使用for循环会更优。
3.类class使用foreach
在PHP5.0以上,类可以定义迭代操作,继承Iterator接口。
Iterator接口的定义如下:
Iterator extends Traversable {
/* Methods */
abstract public mixed current ( void )
abstract public scalar key ( void )
abstract public void next ( void )
abstract public void rewind ( void )
abstract public boolean valid ( void )
}
为了类能够进行foreach操作,类必须实现Iterator接口的方法,以下修改后PHP.net上的一个例子。
class myIterator implements Iterator {
private $array = array(
"firstelement",
"secondelement",
"lastelement",
);
public function __construct() {
}
function rewind() {
reset($this->array);
}
function current() {
return current($this->array);
}
function key() {
return key($this->array);
}
function next() {
return next($this->array);
}
function valid() {
return $this->current()===false?false:true;
}
}
$it = new myIterator;
foreach($it as $key => $value) {
var_dump($key, $value);
echo "\n";
}