SplFixedArray
與 PHP 陣列的區別
PHP 的預設陣列型別實際上是作為有序雜湊對映實現的,它允許我們建立由鍵/值對組成的陣列,其中值可以是任何型別,鍵可以是數字或字串。然而,傳統上不是如何建立陣列的。
因此,從這個插圖中可以看出,普通的 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 陣列也是動態調整大小的。當我們自動向陣列推送和從陣列中彈出值時,它們會增長和縮小。
但是,在傳統陣列中,大小是固定的,完全由相同型別的值組成。此外,不是鍵,而是每個值都是由其索引訪問,這可以通過其在陣列中的偏移量來推斷。
由於我們知道給定型別的大小和陣列的固定大小,因此 type size * n
是 n
,表示值在陣列中的位置。所以在上面的例子中,$arr[0]
給了我們 1
,陣列中的第一個元素,$arr[1]
給了我們 2
,依此類推。
但是,SplFixedArray 不限制值的型別。它只限制數字型別的鍵。它也是一個固定的大小。
這使 SplFixedArrays 以一種特定的方式比普通的 PHP 陣列更有效。它們更緊湊,因此需要更少的記憶體。
例項化陣列
SplFixedArray 是作為物件實現的,但是可以使用與訪問普通 PHP 陣列相同的熟悉語法來訪問它,因為它們實現了 ArrayAccess
介面。它們還實現了 Countable
和 Iterator
介面,因此它們的行為方式與你在 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
你還可以使用 fromArray
和 toArray
方法將正常的 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