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