使用SplFixedArray创建固定大小的数组

  PHP在定义数组的时候不用像C或Java一样定义数组大小,PHP数组可以根据我们的需要增长或收缩。但这种灵活性在内存使用方面带来很大的不便。

  而PHP中可以使用SplFixedArray创建固定大小的数组。当我们知道一个数组中只需要一定数量的元素时,我们可以使用一个固定的数组来减少内存的使用。

 

 

$array = new SplFixedArray(10);//初始化数组大小为10

for ($i = 0; $i < 10; $i++)
$array[$i] = $i;

for ($i = 0; $i < 10; $i++)
echo $array[$i] . "\n";

输出结果为0,1,2,3,4,5,6,7,8,9

当我们想访问一个越界的索引时,如$array[10],会抛出一个异常:

PHP Fatal error: Uncaught RuntimeException: Index invalid or out of range

PHP数组和SplFixedArray的基本区别是:

  • SplFixedArray必须有一个固定的定义大小
  • SplFixedArray的索引必须是整数,并且在0到n的范围内,其中n是定义的数组的大小

SplFixedArray方法在有许多已知大小的已定义数组或数组的最大所需大小的上限时非常方便。但是如果不知道数组的大小,那么最好使用PHP数组。

 注意:虽然将SplFixedArray对象与[]一起使用,但PHP数组函数并不适用于SplFixedArray。不能直接应用任何PHP数组函数,比如array_sum、array_filter等等。

PHP数组更改为SplFixedArray

如果想在运行时创建一个SplFixedArray数组,下面的代码块展示了如何实现

$array =[1 => 10, 2 => 100, 3 => 1000, 4 => 10000]; 
$splArray = SplFixedArray::fromArray($array); 
print_r($splArray);

这里,使用SplFixedArray类的静态方法fromArray,从现有的array $array构造一个SplFixedArray。然后使用PHP print_r函数打印数组。将显示如下输出:

SplFixedArray Object
(
[0] =>
[1] => 10
[2] => 100
[3] => 1000
[4] => 10000
)

可以看到数组现在已经被转换为SplFixedArray,并且它保持了与实际数组中索引号完全相同的索引号。由于实际数组没有定义0索引,这里索引0保留为null。但是如果想忽略前一个数组中的索引并为它们分配新的索引,那么必须将前一个代码的第二行改为:

$splArray = SplFixedArray::fromArray($array,false);

现在,如果再次打印数组,将得到以下输出:

SplFixedArray Object
(
[0] => 10
[1] => 100
[2] => 1000
[3] => 10000
)

SplFixedArray转换为PHP数组

还可能需要将SplFixedArray转换为常规的PHP数组,以便从PHP应用一些预定义的数组函数。和前面的例子一样,这也是一件非常简单的事情:

$items = 5;
$array = new SplFixedArray($items);
for ($i = 0; $i < $items; $i++) {
$array[$i] = $i * 10;
}

$newArray = $array->toArray();
print_r($newArray);

这将产生以下输出:

Array
(
[0] => 0
[1] => 10
[2] => 20
[3] => 30
[4] => 40
)

声明后更改SplFixedArray大小

由于在开始时定义数组大小,因此可能需要在稍后更改大小。为此,必须使用SplFixedArray类的setSize()方法。例子如下:

$items = 5;
$array = new SplFixedArray($items);
for ($i = 0; $i < $items; $i++) {
$array[$i] = $i * 10;
}

$array->setSize(10);
$array[7] = 100;

使用SplFixedArray创建多维数组

还可能需要使用SplFixedArray创建两个或多个维度数组。为了做到这一点,建议遵循以下例子:

$array = new SplFixedArray(100);
for ($i = 0; $i < 100; $i++)
$array[$i] = new SplFixedArray(100);

实际上是在每个数组索引中创建另一个SplFixedArray。可以添加任意多个维度。但是要记住,对于维数,我们要乘以数组的大小。所以它可以长得非常快。

posted @ 2019-07-29 16:52  独孤靖云  阅读(478)  评论(0编辑  收藏  举报