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