数据结构
在线手册:中文  英文

The SplFixedArray class

(PHP 5 >= 5.3.0)

简介

The SplFixedArray class provides the main functionalities of array. The main differences between a SplFixedArray and a normal PHP array is that the SplFixedArray is of fixed length and allows only integers within the range as indexes. The advantage is that it allows a faster array implementation.

类摘要

SplFixedArray implements Iterator , ArrayAccess , Countable {
/* 方法 */
public __construct ([ int $size = 0 ] )
public int count ( void )
public mixed current ( void )
public static SplFixedArray fromArray ( array $array [, bool $save_indexes = true ] )
public int getSize ( void )
public int key ( void )
public void next ( void )
public bool offsetExists ( int $index )
public mixed offsetGet ( int $index )
public void offsetSet ( int $index , mixed $newval )
public void offsetUnset ( int $index )
public void rewind ( void )
public int setSize ( int $size )
public array toArray ( void )
public bool valid ( void )
public void __wakeup ( void )
}

范例

Example #1 SplFixedArray usage example

<?php
// Initialize the array with a fixed length
$array = new SplFixedArray(5);

$array[1] = 2;
$array[4] = "foo";

var_dump($array[0]); // NULL
var_dump($array[1]); // int(2)

var_dump($array["4"]); // string(3) "foo"

// Increase the size of the array to 10
$array->setSize(10);

$array[9] = "asdf";

// Shrink the array to a size of 2
$array->setSize(2);

// The following lines throw a RuntimeException: Index invalid or out of range
try {
    
var_dump($array["non-numeric"]);
} catch(
RuntimeException $re) {
    echo 
"RuntimeException: ".$re->getMessage()."\n";
}

try {
    
var_dump($array[-1]);
} catch(
RuntimeException $re) {
    echo 
"RuntimeException: ".$re->getMessage()."\n";
}

try {
    
var_dump($array[5]);
} catch(
RuntimeException $re) {
    echo 
"RuntimeException: ".$re->getMessage()."\n";
}
?>

以上例程会输出:

NULL
int(2)
string(3) "foo"
RuntimeException: Index invalid or out of range
RuntimeException: Index invalid or out of range
RuntimeException: Index invalid or out of range

Table of Contents


数据结构
在线手册:中文  英文

用户评论:

artaxerxes (2012-11-13 04:41:10)

As the documentation says, SplFixedArray is meant to be *faster* than array. Do not blindly believe other people's benchmarks, and beextra careful with the user comments on php.net. For instance, nairbv's benchmark code is completely wrong. Among other errors, it intends to increase the size of the arrays, but always initialize a 20 elements SplFixedArray.
On a PHP 5.4 64 bits linux server, I found SplFixedArray to be always faster than array().
* small data (1,000):
* write: SplFixedArray is 15 % faster
* read: SplFixedArray is 5 % faster
* larger data (512,000):
* write: SplFixedArray is 33 % faster
* read: SplFixedArray is 10 % faster

alex dot andrienko at gmail dot com (2010-11-15 02:13:15)

Memory footprint of splFixedArray is about 37% of a regular "array" of the same size.
I was hoping for more, but that's also significant, and that's where you should expect to see difference, not in "performance".

nairbv AT yahoo DOT com (2009-10-21 02:08:48)

Though, object creation overhead means this method is slower for small arrays.

for example, if the other posters benchmark script is changed to a more realistic:

<?php
$elements 
20;
for(
$size 1000$size 50000000$size *= 2) {
    echo 
PHP_EOL "Testing size: $sizePHP_EOL;
    for(
$s microtime(true), $i 0$i $size$i++) {
        for(
$j=0,$container=array();$j $elements$j++ ) {
            
$container[$i] = NULL;
        }
    }
    echo 
"Array(): " . (microtime(true) - $s) . PHP_EOL;

    for(
$s microtime(true), $i 0$i $size$i++) {
        for( 
$j=0,$container=new SplFixedArray($elements);$j<$elements;$j++) {
            
$container[$i] = NULL;
        }
    }
    echo 
"SplArray(): " . (microtime(true) - $s) . PHP_EOL;
}

we get:

Testing size1000
Array(): 0.0030221939086914
SplArray
(): 0.0041899681091309

Testing size
2000
Array(): 0.0060598850250244
SplArray
(): 0.0083701610565186

Testing size
4000
Array(): 0.012003898620605
SplArray
(): 0.016681909561157

Testing size
8000
Array(): 0.024173021316528
SplArray
(): 0.033347129821777

Testing size
16000
Array(): 0.048118829727173
SplArray
(): 0.066897869110107

Testing size
32000
Array(): 0.096546173095703
SplArray
(): 0.13370203971863

Testing size
64000
Array(): 0.1932430267334
SplArray
(): 0.26755595207214

Testing size
128000
Array(): 0.38473010063171
SplArray
(): 0.5374698638916

Testing size
256000
Array(): 0.77228307723999
SplArray
(): 1.0708079338074

Testing size
512000
Array(): 1.5438990592957
SplArray
(): 2.1406710147858

Testing size
1024000
Array(): 3.0910761356354
SplArray
(): 4.3108429908752

Testing size
2048000
Array(): 6.1561989784241
SplArray
(): 8.612802028656

......

chrisstocktonaz at gmail dot com (2009-07-14 11:07:21)

Note, that this is considerably faster and should be used when the size of the array is known. Here are some very basic bench marks:

<?php
for($size 1000$size 50000000$size *= 2) {
    echo 
PHP_EOL "Testing size: $sizePHP_EOL;
    for(
$s microtime(true), $container = Array(), $i 0$i $size$i++) $container[$i] = NULL;
    echo 
"Array(): " . (microtime(true) - $s) . PHP_EOL;

    for(
$s microtime(true), $container = new SplFixedArray($size), $i 0$i $size$i++) $container[$i] = NULL;
    echo 
"SplArray(): " . (microtime(true) - $s) . PHP_EOL;
}
?>

OUTPUT
Testing size: 1000
Array(): 0.00046396255493164
SplArray(): 0.00023293495178223

Testing size: 2000
Array(): 0.00057101249694824
SplArray(): 0.0003058910369873

Testing size: 4000
Array(): 0.0015869140625
SplArray(): 0.00086307525634766

Testing size: 8000
Array(): 0.0024251937866211
SplArray(): 0.00211501121521

Testing size: 16000
Array(): 0.0057680606842041
SplArray(): 0.0041120052337646

Testing size: 32000
Array(): 0.011334896087646
SplArray(): 0.007631778717041

Testing size: 64000
Array(): 0.021990060806274
SplArray(): 0.013560056686401

Testing size: 128000
Array(): 0.053267002105713
SplArray(): 0.030976057052612

Testing size: 256000
Array(): 0.10280108451843
SplArray(): 0.056283950805664

Testing size: 512000
Array(): 0.20657992362976
SplArray(): 0.11510300636292

Testing size: 1024000
Array(): 0.4138810634613
SplArray(): 0.21826505661011

Testing size: 2048000
Array(): 0.85640096664429
SplArray(): 0.46247816085815

Testing size: 4096000
Array(): 1.7242450714111
SplArray(): 0.95304894447327

Testing size: 8192000
Array(): 3.448086977005
SplArray(): 1.96746301651

易百教程