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。可以添加任意多个维度。但是要记住,对于维数,我们要乘以数组的大小。所以它可以长得非常快。

使用SplFixedArray创建固定大小的数组的更多相关文章

  1. C#使用Fixed创建固定大小的缓冲区

    在 C# 中,可以使用 fixed 语句在数据结构中创建带有固定大小数组的缓冲区. 使用现有代码(如使用其他语言.预先存在的 DLL 或 COM 项目编写的代码)时,这种方法非常有用. 固定数组可采用 ...

  2. ExecutorService常用方法和newFixedThreadPool创建固定大小的线程池

    1.ExecutorService: 是一个接口,继承了Executor: public interface ExecutorService extends Executor { } 2.Execut ...

  3. Hyper-V创建固定大小虚拟机

    1.新建硬盘 点击确定,就创建好了一个固定大小的vhd文件,下面我们开始创建虚拟机. 2.创建虚拟机 输入虚拟机名称 选择第一代虚拟机 我这里给虚拟机分配512MB内存 网络配置 在这之前我们已经创建 ...

  4. 使用Java创建指定大小的空文件夹

    /** 方法一 * 创建固定大小的文件 * @param file * @param length * @throws IOException */ public static void create ...

  5. 精解Mat类(一):基本数据类型-固定大小的 矩阵类(Matx) 向量类(Vector)

    一.基础数据类型 1.(基础)固定大小矩阵类 matx 说明: ①    基础矩阵是我个人增加的描述,相对于Mat矩阵类(存储图像信息的大矩阵)而言. ②    固定大小矩阵类必须在编译期间就知晓其维 ...

  6. 6、java5线程池之固定大小线程池newFixedThreadPool

    JDK文档说明: 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程.在任意点,在大多数 nThreads 线程会处于处理任务的活动状态.如果在所有线程处于活动状态时提交附加任务,则 ...

  7. matlab学习笔记12_3串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields

    一起来学matlab-matlab学习笔记12 12_3 结构体 串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields 觉得有用的话 ...

  8. textarea 在浏览器中固定大小和禁止拖动

    HTML 标签 textarea 在大部分浏览器中只要指定行(rows)和列(cols)属性,就可以规定 textarea 的尺寸,大小就不会改变,不过更好的办法是使用 CSS 的 height 和 ...

  9. 创建struct类型的数组

    在autoit中,如何创建类似这样的数组呢?如下方式,数组的element只是存储的地址相邻,所以我们可以这样做 $tagMYSTRUCT = "int code; char msg[10] ...

随机推荐

  1. Benchmark result without MONITOR running: Benchmark result with MONITOR running (redis-cli monitor > /dev/null): 吞吐量 下降约1半 Redis监控工具,命令和调优

    https://redis.io/commands/monitor In this particular case, running a single MONITOR client can reduc ...

  2. sql中union,union all没有兼顾到的内容

    今日遇到一个问题,两张表联合取交集去重,但是需要把某一字段相同的也给去掉 union all : 联合,没有取交集 union :联合取交集(仅针对所有字段相同的去重) 解决方案:将联合的数据作为一个 ...

  3. Android:系统自定义鼠标样式切换

    一.APP通过View修改鼠标样式 app view上修改鼠标样式比较简单,通过 hover event 获取鼠标坐标并使用如下方法修改为自定义图片: getWindow().getDecorView ...

  4. 怎样创建一个OpenStack官方账号?

    OpenStack官方账号分两种: 社区成员 (Community Member) 基金会成员 (Foundation Member) 基金会成员比社区成员的权利多一点: 允许提交峰会议题 允许对峰会 ...

  5. markdown 测试博客发布

    这是一个测试页面 无序列表 tet test 有序列表 特使团 tetst 引用 This is a test 插入图片 插入链接 baidu 粗体 这是粗体 斜体 这是斜体 表格 IP VIP 备注 ...

  6. 完全解读 margin 标签

    你真的了解margin吗?你知道margin有什么特性吗?你知道什么是垂直外边距合并?margin在块元素.内联元素中的区别?什么时候该用 padding而不是margin?你知道负margin吗?你 ...

  7. ELK之elasticsearch7版本集群设置

    ELK7版本搭建参考:https://www.cnblogs.com/minseo/p/10948632.html node-1已经安装配置好 配置文件如下 [root@salt-test conf. ...

  8. .net视频截图功能,没测试

    /// <summary> /// @从视频文件截图,生成在视频文件所在文件夹 /// 在Web.Config 中需要两个前置配置项: /// 1.ffmpeg.exe文件的路径 ///  ...

  9. iOS-NSTimer计时器

    (3) 计时器NSTimer + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget sel ...

  10. CenOS 7 权限命令

    修改拥有者chown chown 拥有者名称 文件名 修改组chgrpchgrp 组名 文件名 修改权限 chmodchmod 权限 文件名