Looking for php Keywords? Try Ask4Keywords

PHP SplFixedArray


與PHP數組的區別

PHP的默認數組類型實際上是作為有序哈希映射實現的,它允許我們創建由鍵/值對組成的數組,其中值可以是任何類型,鍵可以是數字或字符串。然而,傳統上不是如何創建數組的。

傳統的PHP數組圖1

因此,從這個插圖中可以看出,普通的PHP數組可以更像是一組有序的鍵/值對,其中每個鍵都可以映射到任何值。請注意,在這個數組中,我們有數字和字符串的鍵,以及不同類型的值,鍵與元素的順序無關。

$arr = [
    9     => "foo",
    1     => 4.2,
    "bar" => null,
];

foreach($arr as $key => $value) {
    echo "$key => $value\n";
}

所以上面的代碼會給我們準確的預期。

9 => foo
1 => 4.2
bar => 

常規PHP數組也是動態調整大小的。當我們自動向數組推送和從數組中彈出值時,它們會增長和縮小。


但是,在傳統數組中,大小是固定的,完全由相同類型的值組成。此外,不是鍵,而是每個值都是由其索引訪問,這可以通過其在數組中的偏移量來推斷。

SplFixedArray圖2

由於我們知道給定類型的大小和數組的固定大小,因此偏移量是type size * nn表示值在數組中的位置。所以在上面的示例中, $arr[0]給出了1 ,數組中的第一個元素和$arr[1]給出了2 ,依此類推。

但是,SplFixedArray不限制值的類型。它只限制數字類型的鍵。它也是一個固定的大小。

這使SplFixedArrays以一種特定的方式比普通的PHP數組更有效。它們更緊湊,因此需要更少的內存。

實例化數組

SplFixedArray是作為對象實現的,但是可以使用與訪問普通PHP數組相同的熟悉語法來訪問它,因為它們實現了ArrayAccess接口。它們還實現了CountableIterator接口,因此它們的行為方式與用於PHP中的數組行為的方式相同(例如count($arr)foreach($arr as $k => $v)工作方式相同SplFixedArray,因為它們在PHP中執行普通數組。

SplFixedArray構造函數接受一個參數,該參數是數組的大小。

$arr = new SplFixedArray(4);

$arr[0] = "foo";
$arr[1] = "bar";
$arr[2] = "baz";

foreach($arr as $key => $value) {
    echo "$key => $value\n";
}

這可以滿足您的期望。

0 => foo
1 => bar
2 => baz
3 => 

這也按預期工作。

var_dump(count($arr));

給我們...

int(4)

請注意,在SplFixedArray中,與普通的PHP數組不同,該鍵確實描述了數組中元素的順序,因為它是一個真正的索引 ,而不僅僅是一個映射

調整陣列大小

請記住,因為數組具有固定大小,count將始終返回相同的值。因此,雖然未unset($arr[1])將導致$arr[1] === null ,但count($arr)仍然為4

因此,要調整數組大小,您需要調用setSize方法。

$arr->setSize(3);

var_dump(count($arr));

foreach($arr as $key => $value) {
    echo "$key => $value\n";
}

現在我們得到......

int(3)
0 => foo
1 => 
2 => baz

從SplFixedArray導入SplFixedArray和Export

您還可以使用fromArraytoArray方法將正常的PHP數組導入/導出fromArray

$array      = [1,2,3,4,5];
$fixedArray = SplFixedArray::fromArray($array);

foreach($fixedArray as $value) {
    echo $value, "\n";
}
1
2
3
4
5

走另一條路。

$fixedArray = new SplFixedArray(5);

$fixedArray[0] = 1;
$fixedArray[1] = 2;
$fixedArray[2] = 3;
$fixedArray[3] = 4;
$fixedArray[4] = 5;

$array = $fixedArray->toArray();

foreach($array as $value) {
    echo $value, "\n";
}
1
2
3
4
5