当前位置: 首页 > news >正文

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.lqws.cn/news/544249.html

相关文章:

  • 通达信 稳定盈利多维度趋势分析系统
  • 鸿蒙OS开发IoT控制应用:从入门到实践
  • 概述-2-MySQL安装及启动-1-Dcoker安装MySQL
  • vue将页面导出pdf,vue导出pdf ,使用html2canvas和jspdf组件
  • Jmeter并发测试和持续性压测
  • 手机屏亮点缺陷修复及相关液晶线路激光修复原理
  • 利用云雾自动化在智能无人水面航行器中实现自主碰撞检测和分类
  • UI前端大数据处理实战技巧:如何有效应对数据延迟与丢失?
  • PILCO: 基于模型的高效策略搜索方法原理解析
  • HarmonyOS 5智能单词应用开发:记忆卡(附:源码
  • JVM 的 Dump分析以及 GC 日志
  • Vulkan模型查看器设计:相机类与三维变换
  • 【Python数据库】Python连接3种数据库方法(SQLite\MySQL\PostgreSQL)
  • 人工智能-基础篇-4-人工智能AI、机器学习ML和深度学习DL之间的关系
  • 人工智能-基础篇-3-什么是深度学习?(DL,卷积神经网络CNN,循环神经网络RNN,Transformer等)
  • fish安装node.js环境
  • 【CMake基础入门教程】第八课:构建并导出可复用的 CMake 库(支持 find_package() 查找)
  • 视觉疲劳检测如何优化智能驾驶的险情管理
  • Java练习题精选16-20
  • C++01背包问题
  • 汇总表支持表头分组,查询组件查询框可以调整高度,DataEase开源BI工具v2.10.11 LTS版本发布
  • ESP32 008 MicroPython Web框架库 Microdot 实现的网络文件服务器
  • A Machine Learning Approach for Non-blind Image Deconvolution论文阅读
  • 金蝶云星空客户端自定义控件插件-WPF实现自定义控件
  • 电磁波是如何传递信息的?
  • 鸿蒙 List 组件解析:从基础列表到高性能界面开发指南
  • 前端 E2E 测试实践:打造稳定 Web 应用的利器!
  • 海外 AI 部署:中国出海企业如何选择稳定、安全的云 GPU 基础设施?
  • 扬州搓澡非遗解码:三把刀文化的“水包皮“
  • 010 【入门】链表入门题目-合并两个有序链表