使用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。可以添加任意多个维度。但是要记住,对于维数,我们要乘以数组的大小。所以它可以长得非常快。
使用SplFixedArray创建固定大小的数组的更多相关文章
- C#使用Fixed创建固定大小的缓冲区
在 C# 中,可以使用 fixed 语句在数据结构中创建带有固定大小数组的缓冲区. 使用现有代码(如使用其他语言.预先存在的 DLL 或 COM 项目编写的代码)时,这种方法非常有用. 固定数组可采用 ...
- ExecutorService常用方法和newFixedThreadPool创建固定大小的线程池
1.ExecutorService: 是一个接口,继承了Executor: public interface ExecutorService extends Executor { } 2.Execut ...
- Hyper-V创建固定大小虚拟机
1.新建硬盘 点击确定,就创建好了一个固定大小的vhd文件,下面我们开始创建虚拟机. 2.创建虚拟机 输入虚拟机名称 选择第一代虚拟机 我这里给虚拟机分配512MB内存 网络配置 在这之前我们已经创建 ...
- 使用Java创建指定大小的空文件夹
/** 方法一 * 创建固定大小的文件 * @param file * @param length * @throws IOException */ public static void create ...
- 精解Mat类(一):基本数据类型-固定大小的 矩阵类(Matx) 向量类(Vector)
一.基础数据类型 1.(基础)固定大小矩阵类 matx 说明: ① 基础矩阵是我个人增加的描述,相对于Mat矩阵类(存储图像信息的大矩阵)而言. ② 固定大小矩阵类必须在编译期间就知晓其维 ...
- 6、java5线程池之固定大小线程池newFixedThreadPool
JDK文档说明: 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程.在任意点,在大多数 nThreads 线程会处于处理任务的活动状态.如果在所有线程处于活动状态时提交附加任务,则 ...
- matlab学习笔记12_3串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields
一起来学matlab-matlab学习笔记12 12_3 结构体 串联结构体,按属性创建含有元胞数组的结构体,filenames,isfield,isstruct,orderfields 觉得有用的话 ...
- textarea 在浏览器中固定大小和禁止拖动
HTML 标签 textarea 在大部分浏览器中只要指定行(rows)和列(cols)属性,就可以规定 textarea 的尺寸,大小就不会改变,不过更好的办法是使用 CSS 的 height 和 ...
- 创建struct类型的数组
在autoit中,如何创建类似这样的数组呢?如下方式,数组的element只是存储的地址相邻,所以我们可以这样做 $tagMYSTRUCT = "int code; char msg[10] ...
随机推荐
- Leetcode题 112 和 113. Path Sum I and II
112题目如下: Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that addi ...
- Linux中系统状态检测命令
1.ifconfig用于获取网卡配置与网络状态等信息,格式为:ifconfig [网络设备] [参数] 2.uname命令用于查看系统内核版本等信息,格式为:uname [-a] 查看系统的内核名称. ...
- java spark list 转为 RDD 转为 dataset 写入表中
package com.example.demo; import java.util.ArrayList; import java.util.Arrays; import java.util.Hash ...
- Java 8 Lambda表达式学习和理解
Java 8 Lambda表达式和理解 说明:部分资料来源于网络 时间:20190704 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性.Lambda 允许把函数作为一 ...
- Qt编写自定义控件45-柱状标尺控件
一.前言 这个控件写了很久了,是最早期的一批控件中的一个,和温度计控件类似,都是垂直的进度条,可以设置不同的背景颜色,左侧的刻度也可以自由设定,还提供了动画效果,其实就是开启定时器慢慢的进度到设定的目 ...
- 一百四十七:CMS系统之celery实现邮件和短信异步发送
celery工作原理 celery官方文档:https://docs.celeryproject.org/en/latest/ 安装:pip install celery windows下还需安装ev ...
- 源码安装LNMP
需要准备的安装包以及下载地址(只是一个大概地址,版本和下载方式需要自行选择): Nginx http://nginx.org/en/download.html nginx主程序包 MySQL http ...
- SM30维护视图屏蔽按钮与增加选择条件
*---------------------------------------------------------------------- * TABLES/Structure *-------- ...
- sql 获取本周周一和周日
版本1.0(获取周日存在问题,请勿使用,仅用于引以为戒) 存在问题,获取周日的时候,当当前时间正好是周日,会获取下一周的周日,而非本周周日. ,)),) ),, ,)),) 版本2.0 看到版本1.0 ...
- linux 运维指令
[root@yan- ~] # uname -a # 查看内核/操作系统/CPU信息的linux系统信息命令 [root@yan- ~] # head -n /etc/issue # 查看操作系统版本 ...