SplFixedArray

與 PHP 陣列的區別

PHP 的預設陣列型別實際上是作為有序雜湊對映實現的,它允許我們建立由鍵/值對組成的陣列,其中值可以是任何型別,鍵可以是數字或字串。然而,傳統上不是如何建立陣列的。

StackOverflow 文件

因此,從這個插圖中可以看出,普通的 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 陣列也是動態調整大小的。當我們自動向陣列推送和從陣列中彈出值時,它們會增長和縮小。

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

StackOverflow 文件

由於我們知道給定型別的大小和陣列的固定大小,因此 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 陣列匯入/匯出 SplFixedArray。

$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