SplFixedArray与普通的PHP Array不同,它是以数字为键名的固定长度的数组,它没有使用散列(Hash)存储方式,更接近于C语言的数组,因此效率更高。
接口摘要如下:
SplFixedArray implements Iterator , ArrayAccess , Countable {
// 创建一个固定长度的数组
public __construct ([ int $size = 0 ] )
// 返回固定长度数组的大小
public int count ( void )
// 返回当前数组元素
public mixed current ( void )
// 导入一个PHP普通数组来生成SplFixedArray实例
public static SplFixedArray fromArray ( array $array [, bool $save_indexes = true ] )
// 返回固定长度数组的大小
public int getSize ( void )
// 返回当前数组元素对应的键
public int key ( void )
// 将数组游标指向下一个数组元素
public void next ( void )
// 判断数组key对应的元素是否存在
public bool offsetExists ( int $index )
// 获取数组key对应的元素
public mixed offsetGet ( int $index )
// 设置数组key对应的元素
public void offsetSet ( int $index , mixed $newval )
// 销毁数组key对应的元素
public void offsetUnset ( int $index )
// 重置数组游标
public void rewind ( void )
// 设置固定数组的大小
public int setSize ( int $size )
// 从SplFixedArray实例返回一个普通PHP的数组
public array toArray ( void )
// 判断当前数组游标指向的元素是否有效
public bool valid ( void )
// 魔术方法,反序列化时调用
public void __wakeup ( void )
}
性能测试:
<?php
for($size = 2000; $size < 3000000; $size *= 2) {
echo "Testing size: $size" . '<br/>';
for($s = microtime(true), $container = Array(), $i = 0; $i < $size; $i++) $container[$i] = NULL;
echo "Array(): " . (microtime(true) - $s) . '<br/>';
for($s = microtime(true), $container = new SplFixedArray($size), $i = 0; $i < $size; $i++) $container[$i] = NULL;
echo "SplArray(): " . (microtime(true) - $s) . '<br/>';
}
?>
输出:
Testing size: 2000
Array(): 0.00025796890258789
SplArray(): 0.00016403198242188
Testing size: 4000
Array(): 0.00034499168395996
SplArray(): 0.00035691261291504
Testing size: 8000
Array(): 0.00068116188049316
SplArray(): 0.00094199180603027
Testing size: 16000
Array(): 0.0016441345214844
SplArray(): 0.0014150142669678
Testing size: 32000
Array(): 0.0030548572540283
SplArray(): 0.0026488304138184
Testing size: 64000
Array(): 0.0068099498748779
SplArray(): 0.0023999214172363
Testing size: 128000
Array(): 0.0064020156860352
SplArray(): 0.0048229694366455
Testing size: 256000
Array(): 0.012426853179932
SplArray(): 0.0084249973297119
Testing size: 512000
Array(): 0.018292903900146
SplArray(): 0.013427019119263
Testing size: 1024000
Array(): 0.033282995223999
SplArray(): 0.023661136627197
Testing size: 2048000
Array(): 0.068041086196899
SplArray(): 0.047233104705811
结果说明:
SplFixedArray确实比PHP Array要快,而且数据量越大越明显。
使用示例:
<?php
$splArray = new SplFixedArray(5);
$splArray[1] = 'cat';
$splArray[4] = 'dog';
var_dump($splArray);
unset($splArray);
$splArray = SplFixedArray::fromArray(array('cat','pig','dog'));
var_dump($splArray);
var_dump($splArray->getSize());
var_dump($splArray->toArray());
?>
以上输出:
object(SplFixedArray)#1 (5) { [0]=> NULL [1]=> string(3) "cat" [2]=> NULL [3]=> NULL [4]=> string(3) "dog" }
object(SplFixedArray)#1 (3) { [0]=> string(3) "cat" [1]=> string(3) "pig" [2]=> string(3) "dog" }
int(3)
array(3) { [0]=> string(3) "cat" [1]=> string(3) "pig" [2]=> string(3) "dog" }