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