使用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] ...
随机推荐
- SpringBoot面试题 转(已迁移到java相关知识点)
## 什么是springboot 用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件) 创建独立的spring引用程序 main方法运行 嵌入的 ...
- sql server management studio 连接时指定非默认端口 ,port
- Nginx可以说是标配组件,但是主要场景还是负载均衡、反向代理、代理缓存、限流等场景;而把Nginx作为一个Web容器使用的还不是那么广泛。
Nginx可以说是标配组件,但是主要场景还是负载均衡.反向代理.代理缓存.限流等场景:而把Nginx作为一个Web容器使用的还不是那么广泛. 用Nginx+Lua(OpenResty)开发高性能Web ...
- selenium元素input的value值设置【node.js版本】
driver.executeScript(‘document.getElementById(“id”).value=“value”’); 这个操作就类似于//$("#id").va ...
- Qt编写自定义控件55-手机通讯录
一.前言 前面几篇文章中的控件基本上难度系数接近0,甚至有凑控件数量的嫌疑,这次必须来一个强悍的控件,本控件难度系数在所有控件中排前五,代码量也不少,头文件都550行,实现文件1600行,为什么这么多 ...
- 【420】链表实现Quack
quack.h // quack.h: an interface definition for a queue/stack #include <stdio.h> #include < ...
- Docker 部署 ELK 收集 Nginx 日志
一.简介 1.核心组成 ELK由Elasticsearch.Logstash和Kibana三部分组件组成: Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引 ...
- 123457123456#0#-----com.twoapp.TruckCarRun01--前拼后广--大卡车游戏jiemei
com.twoapp.TruckCarRun01--前拼后广--大卡车游戏jiemei
- 深入理解Java虚拟机 - 书评
谈起<深入理解java虚拟机>这本书,让我印象深刻的就是换工作跳槽面试的时候,当时刚进入java开发这个行业的时候,平时只是做一些对数据库的增删改查等功能,当自己技术增长一些的时候,就开始 ...
- Python(1)自动发送邮件
python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是python自带的,只需import即可使用.smtplib模块主要负责发送邮件,email模块主要负责构造邮件. sm ...