PHP语法基础篇(六):数组

PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型针对多种不同用途进行了优化;它可以被视为数组、列表(向量)、哈希表(映射的实现)、字典、集合、堆栈、队列等等。本篇文章将记录数组的学习过程。

一、创建数组

二、访问数组

1、数组解包

2、遍历数组

三、操作数组

1、添加数组项

2、修改数组项

2.1、在 foreach 循环中修改数组项

3、删除数组项 

四、多维数组

1、二维数组 

五、数组函数


一、创建数组

可以用 array() 语言结构来新建一个 array。它接受任意数量用逗号分隔的 键(key) => 值(value) 对。

array(key  => value,key2 => value2,key3 => value3,...
)

键(key)不是必需的,最后一个数组单元之后的逗号可以省略。

可以用短数组语法 [] 替代 array() 。

 示例 一个简单的数组

$array = array("foo" => "bar","bar" => "foo",
);// 使用短数组语法
$array = ["foo" => "bar","bar" => "foo",
];

 键(key)可以是 integer 或者 string。value 可以是任意类型。

此外 key 会有如下的强制转换:

  • String 中包含有效的十进制 int,除非数字前面有一个 + 号,否则将被转换为 int 类型。例如键名 "8" 实际会被储存为 8。另外, "08" 不会被强制转换,因为它不是一个有效的十进制整数。
  • Float 也会被转换为 int ,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
  • Bool 也会被转换成 int。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
  • Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。
  • Array 和 object 不能被用为键名。坚持这么做会导致警告:Illegal offset type。

如果在数组定义时多个元素都使用相同键名,那么只有最后一个会被使用。

示例 类型转换与覆盖

$array = array(1    => "a","1"  => "b",1.5  => "c",true => "d",
);
var_dump($array);

输出

array (size=1)1 => string 'd' (length=1)

上述示例中所有的键名都被强制转换为 1,则每一个新单元都会覆盖前一个的值,最后剩下的只有一个 "d"。

PHP 数组可以同时含有 int 和 string 类型的键名,因为 PHP 实际并不区分索引数组和关联数组。

PHP 数组可以同时含有 int 和 string 类型的键名,因为 PHP 实际并不区分索引数组和关联数组。

索引数组:在索引数组中,每个项目都有一个索引号。默认情况下,第一个项目的索引是 0,第二个项目的索引是 1,依此类推。(Java中的数组就属于索引数组)

关联数组:是使用分配给它们的命名键的数组。(类似Java中的Map)

PHP 中的数组和其它编程语言中的数组并不完全一样,这一点需要注意。

示例 混合 int 和 string 键名的数组 

$array = array("foo" => "bar","bar" => "foo",1   => -1,-1  => 1,
);
var_dump($array);

输出

array (size=4)'foo' => string 'bar' (length=3)'bar' => string 'foo' (length=3)1 => int -1-1 => int 1

key 为可选项。如果未指定,PHP 将自动使用之前用过的最大 int 键名加上 1 作为新的键名。

接下来看一个不使用键名的示例,此时创建的数组就是一个索引数组。

$array = array("a", "b", "c", "d");
var_dump($array);

输出

array (size=4)0 => string 'a' (length=1)1 => string 'b' (length=1)2 => string 'c' (length=1)3 => string 'd' (length=1)

还可以对某些单元指定键名,而其它位置为空,没有键名。

$array = array("a","b",6 => "c","d",
);
var_dump($array);

输出

array (size=4)0 => string 'a' (length=1)1 => string 'b' (length=1)6 => string 'c' (length=1)7 => string 'd' (length=1)

可以看到最后一个值 "d" 被自动赋予了键名 7。这是由于之前最大的整数键名是 6。


二、访问数组

数组单元可以通过 array[key](数组名[键名]) 来访问。

$arr = array("Hello, World","foo" => "bar","a",
);
var_dump($arr[0]);
var_dump($arr["foo"]);
var_dump($arr[1]);

 输出

string 'Hello, World' (length=12)
string 'bar' (length=3)
string 'a' (length=1)

试图访问一个未定义的数组键名与访问任何未定义变量一样:会导致 E_WARNING 级别错误信息(在 PHP 8.0.0 之前是 E_NOTICE 级别),其结果为 null。

 如果要获取数组中元素的个数,可以使用 count() 函数。count() 函数用于计算数组中元素的数量。

$arr1 = ["a", "b", "c"];
$arr2 = ["a" => 1, "b" => 1];echo count($arr1); // 输出 "3"
echo "<br>";
echo count($arr2); // 输出 "2"

1、数组解包

可以使用 [](自 PHP 7.1.0 起)语言结构解包数组。这些结构可用于将数组解包为不同的变量。

$source_array = ['a', 'b', 'c'];
[$a, $b, $c] = $source_array;echo $a . "<br>";    // 输出 "a"
echo $b . "<br>";    // 输出 "b"
echo $c . "<br>";    // 输出 "c"

如果变量未提供,数组元素将会被忽略。数组解包始终从索引 0 开始。

$source_array = ['a', 'b', 'c'];
// 将索引 2 的元素分配给变量 $c
[, , $c] = $source_array;echo $c;    // 输出 "c"

自 PHP 7.1.0 起,也可以解包关联数组。这在数字索引数组中更容易选择正确的元素,因为可以显式指定索引。

$source_array = ['a' => 1, 'b' => 2, 'c' => 3];
// 将索引 'c' 处的元素分配给变量 $three
['c' => $three] = $source_array;
echo $three;    // 输出 "3"echo "<br>";$source_array = ['a', 'b', 'c'];
// 将索引 2 处的元素分配给变量 $c
[2 => $c] = $source_array;
echo $c;    // 输出 "c"

数组解包也可用于两个变量交换。

$a = 1;
$b = 2;[$b, $a] = [$a, $b];echo $a;    // 输出 "2"
echo "<br>";
echo $b;    // 输出 "1"

2、遍历数组

使用 foreach 对数组进行遍历。

语法

foreach (iterable_expression as $value) {// 代码段
}foreach (iterable_expression as $key => $value) {// 代码段
}

第一种格式遍历给定的 iterable_expression 迭代器。每次循环中,当前单元的值被赋给 $value。该遍历方式用于索引数组。

第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 $key。该遍历方式用于关联数组。

示例 foreach 遍历索引数组

$arr = ["a", "b", "c", "d"];
foreach($arr as $value) {echo $value . "<br>";
}
/* 输出abcd
*/

示例 foreach 遍历关联数组

$arr = ['a' => 1, 'b' => 2, 'c' => 3];
foreach($arr as $key => $value) {echo $key . ":" . $value . "<br>";
}
/* 输出a:1b:2c:3
*/

三、操作数组

1、添加数组项

使用括号 [] 语法向现有数组中添加项(用于索引数组)。

$arr = ["a", "b", "c"];
$arr[] = ["d"];
var_dump($arr);

还可以使用 数组名[键名]=值 的方式向数组中添加项,如果键名在数组中已经存在,则会更改该键名对应的值。

$arr = ["a" => 1, "b" => 2, "c" => 3];
$arr["d"] = 4;
var_dump($arr);

使用 array_push() 函数可以向现有数组中添加多个项(用于索引数组)。

$arr = ["a", "b", "c"];
array_push($arr, "d", "e", "f");
var_dump($arr);

要向关联数组中添加多个项,可以使用 += 运算符。

$arr = ["a" => 1, "b" => 2, "c" => 3];
$arr += ["d" => 4, "e" => 5];
var_dump($arr);

2、修改数组项

要修改现有的数组项,对于索引数组,可以引用索引号;对于关联数组,可以引用键名。

示例 更改索引数组指定项的值

// 将数组第二项,即索引为 1 的项的值改为 "B"
$arr = ["a", "b", "c"];
$arr[1] = "B";
var_dump($arr);

示例 更改关联数组指定键名的值

// 将键名 "b" 的值更改为 "二"
$arr = ["a" => 1, "b" => 2, "c" => 3];
$arr["b"] = "二";
var_dump($arr);

2.1、在 foreach 循环中修改数组项

通过在 $value 之前加上 & 来修改数组的元素。此方法将以引用赋值而不是拷贝一个值。

$arr = [1, 2, 3, 4];
foreach ($arr as &$value) {$value = $value * 2;
}
// 现在 $arr 是 array[2, 4, 6, 8]
unset($value); // 最后取消掉引用
var_dump($arr);

注意:数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。

3、删除数组项 

使用 unset() 函数来删除现有的数组项。该函数接受无限数量的参数,因此可用于删除多个数组项。

$arr = ["a", "b", "c", "d", "e", "f"];
unset($arr[1]); // 删除1项
unset($arr[3], $arr[4]); // 删除多项
var_dump($arr);$phones = array("brand" => "Vivo", "price" => 1999, "color" => "red");
unset($phones["price"]); // 删除关联数组中指定键名项
var_dump($phones);

输出

array (size=3)0 => string 'a' (length=1)2 => string 'c' (length=1)5 => string 'f' (length=1)
array (size=2)'brand' => string 'Vivo' (length=4)'color' => string 'red' (length=3)

注意:unset() 函数不会重新排列索引,这意味着在删除后,数组将不再包含缺失的索引。

 使用 array_pop() 函数删除数组的最后一项。

$arr = ["a", "b", "c", "d", "e", "f"];
array_pop($arr);
var_dump($arr);

使用 array_shift() 函数删除数组的第一项。

$arr = ["a", "b", "c", "d", "e", "f"];
array_shift($arr);
var_dump($arr);

四、多维数组

多维数组是一个包含一个或多个数组的数组,PHP 支持深度为二、三、四、五或更多层的多维数组。

数组的维度表示选择元素所需的索引数量。
  • 对于二维数组,需要两个索引来选择元素
  • 对于三维数组,需要三个索引来选择元素

本篇文章只对二维数组进行说明。

1、二维数组 

二维数组是数组的数组,我们通常使用它来保存表格数据。

首先,来看下面的表格:

手机品牌

库存

价格

华为

200

1999

小米

350

1599

Vivo

103

1799

我们可以将上表中的数据存储在二维数组中,如下所示:

$phones = [["华为", 200, 1999],["小米", 350, 1599],["Vivo", 103, 1799]
];

现在二维的 $phones 数组包含四个数组,并且它有两个索引:行和列(索引都是从 0 开始)。

要访问 $phones 数组的元素,我们必须指向两个索引(行和列):

echo $phones[0][0] . ":库存:" . $phones[0][1] . ",价格:" . $phones[0][2] . "<br>";
echo $phones[1][0] . ":库存:" . $phones[1][1] . ",价格:" . $phones[1][2] . "<br>";
echo $phones[2][0] . ":库存:" . $phones[2][1] . ",价格:" . $phones[2][2] . "<br>";

还可将数组解包用于 foreach 在迭代多维数组时对其进行解包。

foreach ($phones as [$brand, $inventory, $price]) {echo $brand . ":库存:" . $inventory . ",价格:" . $price . "<br>";
}

五、数组函数

PHP 提供了一组内置函数,可用于操作数组。该函数内容过多,就不在文章中一一进行记录了,这里记录下数组函数的文档地址,方便以后使用时查阅。文档地址:数组函数官方文档。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/86672.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/86672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitHub Actions 的深度解析与概念介绍

GitHub Actions 核心定义 Git Actions 是 GitHub 原生提供的 自动化工作流引擎&#xff0c;允许开发者在代码仓库中直接创建、测试、部署代码。其本质是通过事件驱动&#xff08;Event-Driven&#xff09;的自动化管道&#xff0c;将软件开发中的重复任务抽象为可编排的流程。…

TestCafe 全解析:免费开源的 E2E 测试解决方案实战指南

在2025年的数字化浪潮中&#xff0c;Web应用的稳定性和用户体验成为企业竞争的关键&#xff0c;而端到端&#xff08;E2E&#xff09;测试则是确保质量的“守护者”&#xff01;想象一下&#xff0c;您的电商平台因表单错误导致用户流失&#xff0c;或者支付流程因浏览器兼容性…

[CVPR 2025] 高效无监督Prompt与偏好对齐驱动的半监督医学分割

CVPR 2025 | 优化SAM&#xff1a;高效无监督Prompt与偏好对齐驱动的半监督医学分割 论文信息 标题&#xff1a;Enhancing SAM with Efficient Prompting and Preference Optimization for Semi-supervised Medical Image Segmentation作者&#xff1a;Aishik Konwer, Zhijian…

【C++】责任链模式

目录 一、模式核心概念与结构二、C++ 实现示例:员工请假审批系统三、责任链模式的关键特性四、应用场景五、责任链模式与其他设计模式的关系六、C++ 标准库中的责任链模式应用七、优缺点分析八、实战案例:Web 请求过滤器链九、实现注意事项如果这篇文章对你有所帮助,渴望获得…

dp进阶,树形背包(dfs+01)

顾名思义&#xff0c;就是在对树进行搜索的时候&#xff0c;由于限制了子节点选根节点必选和节点数限制&#xff0c;所以需要额外利用背包来维护最大值 假设根节点就是0&#xff0c;我们很容易 发现&#xff0c;这就是一个正常的树求和&#xff0c;但是限制了节点数量&#xf…

微信小程序安卓手机输入框文字飘出输入框

最近在开发微信小程序遇到一个问题&#xff0c;安卓手机输入框文字飘出输入框&#xff0c;但是ios系统的手机则正常。 使用情景&#xff1a;做了一个弹窗&#xff0c;弹窗内是表单&#xff0c;需要填写一些信息&#xff0c;但是在填写信息时光标不显示&#xff0c;输入的内容飘…

3 大语言模型预训练数据-3.2 数据处理-3.2.2 冗余去除——3.后缀数组(Suffix Array)在大模型数据去重中的原理与实战

后缀数组&#xff08;Suffix Array&#xff09;在大模型数据去重中的原理与实战 一、后缀数组的核心原理与数据结构二、后缀数组去重的核心流程1. **文档预处理与合并**2. **构建后缀数组**3. **计算最长公共前缀&#xff08;LCP&#xff09;数组**4. **基于LCP检测重复文档** …

数据库外连接详解:方式、差异与关键注意事项

&#x1f504; 数据库外连接详解&#xff1a;方式、差异与关键注意事项 外连接用于保留至少一个表的全部行&#xff0c;即使另一表无匹配记录。以下是三种外连接方式的深度解析&#xff1a; &#x1f50d; 一、外连接的三种类型 1. 左外连接 (LEFT OUTER JOIN) 作用&#xf…

vscode把less文件生成css文件配置,设置生成自定义文件名称和路径

1.下载less插件 在插件市场搜索 less 2.设置生成配置 3.修改out属性 "less.compile": {"compress": false, // 是否删除多余空白字符 一行显示[压缩]"sourceMap": false, // 是否创建文件目录树&#xff0c;true的话会自动生成一个 .css.map …

探索相机成像的奥秘 - 齐次坐标、径向失真和图像传感器倾斜

引言 大家好&#xff01;今天我们将一起探索相机成像背后的一些关键技术概念&#xff1a;齐次坐标、径向失真和图像传感器倾斜。这些概念对于理解相机如何捕捉和处理图像至关重要。我们将通过简单易懂的语言和严谨的公式来详细解释这些概念。 齐次坐标&#xff08;Homogeneou…

校企协同育人,智慧养老实训基地助力人才就业无忧

随着我国人口老龄化程度不断加深&#xff0c;智慧养老产业蓬勃发展&#xff0c;对专业人才的需求日益迫切。校企协同打造智慧养老实训基地&#xff0c;成为解决人才供需矛盾、提升人才培养质量的重要途径。通过科学的建设方案&#xff0c;智慧养老实训基地能够为学生提供实践平…

从需求到落地:一个AI训练平台的售前全流程复盘

目录 一、项目背景:客户要建自己的AI训练平台 二、需求梳理三板斧:并发量、存储带宽、模型种类 1. 并发训练量 2. 存储带宽需求 3. 模型类型与参数规模 三、解决方案设计:GPU选型 + 高速网络 + 存储架构 ✅ GPU服务器选型 ✅ 网络与通信架构 ✅ 存储与数据缓存 四…

织梦DedeCMS转WordPress

最近&#xff0c;有个用户找模板兔迁移网站&#xff0c;源站用的dede&#xff0c;需要转成wp&#xff0c;文章数量大概7000-8000篇&#xff0c;其中有个需求是保证旧文章的链接有效&#xff0c;在wp上的新文章与旧文章的链接类型不一样&#xff0c;所以这涉及到伪静态来处理跳转…

installGo.sh

#!/bin/bash # 检查是否以root用户运行 if [ "$(id -u)" -ne 0 ]; then echo "请使用root权限运行此脚本" exit 1 fi # 检查是否安装了必要的工具 for cmd in curl wget tar; do if ! command -v $cmd &> /dev/null; then echo…

【技术难题】el-table的全局数据排序实现示例,不受分页影响,以及异步请求带来的页面渲染问题

参考链接:https://blog.csdn.net/qq_35770559/article/details/131183121 问题代码 编辑页面detail.vue <el-form title="列表信息" name="detail"><el-form><el-form-item><el-buttontype="cyan"icon="el-icon-p…

非功能测试

非功能测试范畴&#xff1a;界面测试&#xff0c;易用性测试&#xff0c;兼容性测试&#xff0c;文档测试&#xff0c;安装/卸载测试等等 界面测试 1.窗体界面测试 1.窗体定义&#xff1a;指整个软件窗口&#xff0c;也可称为窗口&#xff0c;是界面测试的基本单位 2.控件分…

一起endpoint迷路的问题排查总结

今天上班&#xff0c;一到工位上&#xff0c;就有同事和我说有客户反映自己的容器的一些指标在监控平台不上报了&#xff0c;我当时一看机器所在的监控&#xff0c;发现确实是这样 确实存在某个点开始数据就没了&#xff0c;主要这个点当时也没有任何的操作变更&#xff0c;于…

官方 Linker Scripts 语法和规则解析(2)

系列文章目录 官方 Linker Scripts 语法和规则解析&#xff08;1&#xff09; 官方 Linker Scripts 语法和规则解析&#xff08;2&#xff09; 官方 Linker Scripts 语法和规则解析&#xff08;3&#xff09; 链接脚本(Linker Scripts)语法和规则解析(自官方手册) 7.9. 链接脚…

CentOS 7 通过YUM安装MySQL 8.0完整指南

一、准备工作&#xff1a;更新系统与YUM源 # 1. 更换阿里云镜像源 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo# 2. 清理并重建缓存 yum clean all yum makecache# 3. 升级系统所有包 yum -y update 二、安装MySQL 8.0 1. 下载…

qq邮箱 新版 怎么去掉个性签名?

qq邮箱 新版 怎么去掉个性签名&#xff1f; 新版的qq邮箱&#xff0c;用着还不错&#xff0c;特别是搜索&#xff0c;比以前好多&#xff0c;以前加载的时候&#xff0c;搜索框里有一行字&#xff0c;加载不完&#xff0c;就没法搜索&#xff0c;特别菜。现在好多了。 不过现在…