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. 2018-2019-2 《网络对抗技术》 Exp7 网络欺诈防范 20165222

    1.实践目标 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 2.实践内容 (1)简单应用SET工具建立冒名网站 (1分) apachectl start开启服务 ser ...

  2. pl/sql test Window 参数为date

    好久没写笔记了,感觉颓废了,原因是工作忙,休息时间人也变懒了,好了不说了:今天需要记录一下plsql打开测试窗口测试存储过程时,入参为date格式时报的异常 本以为和sql一样处理就可以,但是报异常, ...

  3. Web安全测试 — 手工安全测试方法&修改建议

    常见问题 1.XSS(CrossSite Script)跨站脚本攻击 XSS(CrossSite Script)跨站脚本攻击.它指的是恶意攻击者往Web 页面里插入恶意 html代码,当用户浏览该页之 ...

  4. 关于Android studio下V4包 KeyEventCompat 类找不到问题

    V4包 KeyEventCompat 类找不到问题   本文链接:https://blog.csdn.net/shanshan_1117/article/details/84344557 今天我把su ...

  5. Win10系统安装VMware-viclient-6.0无响应问题解决方法

    背景:笔记本重做系统升级至Win10系统后,由于工作需要,得安装VMware-viclient-6.0软件进行远程连接. 问题:没有出现网上那种各种报错情况,只是在点击“安装”按钮的时候没弹出任何等待 ...

  6. python方法未绑定错误

    相信 Python 程序员多多少少都和我一样遇到过 Method Unbound Error,直译过来就是 “方法未绑定错误”,虽然搜索之后知道了使用 @classmethod 这样的装饰起后就可以解 ...

  7. unique_ptr智能指针

    一.VS例子 // Test.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <thread> #includ ...

  8. jQuery前端插件以及图片延迟加载

    插件名称 用途 插件官网地址 fontawsome CSS图标插件 http://fontawesome.io easyui 基于jQuery的用户界面插件集合 http://www.jeasyui. ...

  9. nginx多个if条件并且查询

    set $flag 0; if (!-e $request_filename){    set $flag "${flag}1"; } if ($uri ~* "^(.* ...

  10. 第十九章 动态URL权限控制——《跟我学Shiro》

    目录贴:跟我学Shiro目录贴 用过Spring Security的朋友应该比较熟悉对URL进行全局的权限控制,即访问URL时进行权限匹配:如果没有权限直接跳到相应的错误页面.Shiro也支持类似的机 ...