数组的概述和分类
以下内容为两天课堂上讲的知识结构,作业在最后面进行演示和总结,本篇文章主要是展示数组的大概学习内容,以及对一些难点和课堂作业进行演示,课堂的案例不演示。
1. 索引数组与关联数组
- 索引数组索引键名是数值
- 关联数组:键名用非数字的字符串来表示
可以认为索引数组是关联数组的子集, 一个分支
2. 数组的定义和访问
- 传统定义 array()
- 推荐使用[…], 和 javascript 一样的
数组成员的类型,类型不受限制
数组的值如果是数组,就属于多维数组
3. 数组遍历
3.1 逐个遍历
- 利用数组内部的指针(默认第一个)
- current():当前数组成员中的值,key()
3.2 自动遍历
- while 循环(数组元素不能出现假值)
- foreach(),一般遍历二维数组只关心值
- list()
foreach()还可以遍历对象
4. 与值相关的函数
- array_values(\$arr):返回数据中所有成员的值组成的数组,会将键名重置
- in_array(\$search, \$arr): 检查某个元素是否存在于指定的数组中
- array_search(\$search, \$arr): 搜索指定的值, 返回的是键名
- array_unique(\$arr): 删除重复的值, “去重”函数
5. 数组常用函数
5.1 统计相关函数
- count(\$arr): 数组成员数量
- array_count_values(\$arr): 统计数组中某个值的出现的频率
5.2 计算相关函数
- array_sum() 数组求和
- array_product()计算乘积
6. 栈与队列
- 栈类似于搬箱子,最后进入的最先出来
- 尾部添加进栈函数 array_push(),出栈函数 array_pop()
- 头部添加进栈函数 array_unshift(),出栈函数 array_shift()
- 队列类似于排队,最先办理的最先离开
7.排序
7.1 升序
- sort(),升序索引重置
- asort(),升序,但索引不变
7.2 降序
- rsort()降序索引重置
- arsort()降序索引不变
7.3 键排序
- ksort()对键名进行升序排列
- krsort()对键名进行降序排列
7.4 自定义排序
- usort()
7.5 自然排序
- natsort()
nature 自然
7.6 乱序
- shuffle()
7.7 反转排序
- array_reverse()
7.8 键值对换排序
- array_flip()
8. 查询与替换
8.1 array_slice()从数组中取出一部分
8.2 array_splice()删除一部分元素,并用其他值代替
- 可以实现对数组的删除,替换/更新,添加
- array_splice(\$arr,起始索引,数量),返回被删除元素组成的数组
9. 数组元素的回调处理
9.1 array_filter()
- 过滤数组中的单元,返回计算结果为 true 的元素构成新的数组
9.2 array_map()
- 为数组中的每一个元素应用回调函数处理,返回新数组
- 可以同时处理多个数组,功能强大
9.3 array_reduce()
- 迭代处理数组元素
9.4 array_walk()
- 类似 array_map(),凡是返回布尔值
- 主要用于数组成员的格式化
- 不受数组指针影响
作业一 课堂上未讲的数组函数练习
与键相关的函数
- array_keys()获取所有键名组成的数组
- array_key_exists 是否存在指定的键名
- array_key_first()获取第一个键名
- array_key_last()获取最后一个键名
最后两个函数只能用于 php7.3+
<?php
//与键相关的函数
$arr = ['id' => '597826', 'name' => 'nicola', 'teacher' => 'peter zhu', 'course' => 'php'];
$res = print_r(array_keys($arr), true);
printf('<pre>%s</pre>', $res);
//是否存在指定的键名
echo '是否存在teacher这个键名?';
var_dump(array_key_exists('teacher', $arr));
//只能用于最新的php7.3+
echo '<hr>';
echo array_key_first($arr);
echo '<hr>';
echo array_key_last($arr);
查询与替换
- array_rand()从数组中随机取出一个或者多个键名组成新的数组
- array_column()获取多维数组中的一列组成新的数组
- array_replace()使用第二个数组(\$a2)的值替换第一个数组(\$a1)的值:
- array_replace_recursive()递归地使用第二个数组(\$a2)的值替换第一个数组(\$a1)的值:
//从数组中随机取出一个或者多个键名组成新的数组
reset($arr);
$arr = ['id' => '597826', 'name' => 'nicola', 'teacher' => 'peter zhu', 'course' => 'php'];
echo '从数组中随机取出一个或者多个键名组成新的数组';
echo '<br>';
print_r(array_rand($arr, 2));
echo '<hr>';
//array_column()获取多维数组中的一列组成新的数组
$arr = [
['id' => '597826', 'name' => 'nicola', 'teacher' => 'peter zhu', 'course' => 'php'],
['id' => '123', 'name' => '尼古拉', 'teacher' => '朱老师', 'course' => '编程'],
['id' => '312321', 'name' => '尼古拉同学', 'teacher' => 'php中文网的朱老师', 'course' => 'php'],
];
$res = print_r($arr, true);
printf('<pre>%s</pre>', $res);
array_column($arr, 'teacher');
$res = print_r(array_column($arr, 'teacher'), true);
printf('<pre>%s</pre>', $res);
echo '<hr>';
// array_replace()使用第二个数组($a2)的值替换第一个数组($a1)的值:
$arr1 = ['id' => '597826', 'name' => 'nicola'];
$arr2 = ['id' => '1233', 'name' => '尼古拉'];
$arr = array_replace($arr1, $arr2);
$res = print_r($arr, true);
printf('<pre>%s</pre>', $res);
// array_replace_recursive()递归地使用第二个数组($a2)的值替换第一个数组($a1)的值:
$a1 = ['id' => '597826', 'name' => ['尼古拉', '特斯拉']];
$a2 = ['id' => '123456', 'name' => ['nicola']];
$res1 = print_r($a1, true);
echo '原始数组1';
printf('<pre>%s</pre>', $res1);
$res2 = print_r($a2, true);
echo '原始数组2';
printf('<pre>%s</pre>', $res2);
$res = print_r(array_replace_recursive($a1, $a2), true);
echo '递归后';
printf('<pre>%s</pre>', $res);
作业二 将四个数组回调函数自举例演示并发布
array_filter()
- 过滤数组中的单元,返回计算结果为 true 的元素构成新的数组
<?php
function test1($var)
{
return ($var);
}
//过滤返回的空值
$a1 = ["a", "b", 2, 3, 4, '0'];
$res = print_r(array_filter($a1, "test1"), true);
printf('<pre>%s</pre>', $res);
array_map()
- 为数组中的每一个元素应用回调函数处理,返回新数组
- 可以同时处理多个数组,功能强大
将函数作用到数组中的每个值上,每个值都乘以本身,并返回带有新值的数组
//将函数作用到数组中的每个值上,每个值都乘以本身,并返回带有新值的数组:
function myfunction($value)
{
return ($value * $value);
}
$a = array(1, 2, 3, 4, 5);
$res = print_r(array_map("myfunction", $a), true);
printf('<pre>%s</pre>', $res);
array_reduce()
- 语法:array_reduce(array,myfunction,initial)
- 语法:array_reduce(数组,函数,初始值)
- 迭代处理数组元素
// 求总和
function myfunction2($v1, $v2)
{
return $v1 + $v2;
}
$a = array(10, 15, 20);
print_r(array_reduce($a, "myfunction2", 5));
array_walk()
- 类似 array_map(),凡是返回布尔值
- 主要用于数组成员的格式化
不受数组指针影响
对数组中的每个元素应用用户自定义函数
function myfunction3($value, $key)
{
echo "The key $key has the value $value<br>";
}
$a = ["a" => "red", "b" => "green", "c" => "blue"];
array_walk($a, "myfunction3");
作业三 array_slice()与 array_splice()实例演示
array_slice() 函数在数组中根据条件取出一段值,并返回
- 语法 array_slice(array,start,length,preserve)
- preserve,false 重置键名,默认值,true 保留原有键名
<?php
$a = array("red", "green", "blue", "yellow", "brown");
echo '原数组';
printf('<pre>%s</pre>', print_r($a, true));
$res = print_r(array_slice($a, 1, 2), true);
echo '取出索引为1的,长度2的元素';
printf('<pre>%s</pre>', $res);
array_splice() 函数从数组中移除选定的元素,并用新元素取代它。该函数也将返回包含被移除元素的数组
<?php
$a1 = array("a" => "red", "b" => "green", "c" => "blue", "d" => "yellow");
$a2 = array("a" => "purple", "b" => "orange");
echo '原数组';
printf('<pre>%s</pre>', print_r($a1, true));
array_splice($a1, 0, 2, $a2);
$res = print_r($a1, true);
echo '替换';
printf('<pre>%s</pre>', $res);
array_splice() 函数与 array_slice() 函数类似,选择数组中的一系列元素,但不返回,而是删除它们并用其它值代替。
总结
在此,学习完了字符串函数和数组后,更加意识到了工作中需要经常对字符串和数组进行操作,PHP 数组是 PHP 必不可少的一部分,array 函数也有很重要的作用。很多功能可以通过自定义的函数实现,但是非常繁琐敲击一段函数,其实已经有系统函数可以实现这个目的,所以对函数的掌握程度不仅能够提高自己的知识积累,更能给自己未来开发项目省去大量的精力和提高效率。