主要内容:
- 数组的key与value函数:array_keys($arr)、array_values($arr);
- 栈与队列
- 数组排序
- 数组的切片(slice)及增删改(splice)
- 数组的合并(array_combine)
- 数组的回调函数(array_filter及array_map())
- implode(转为字符串)、extract(转为变量)、compact(变量转为数组)
1. 数组的key与value函数
- array_keys($arr)、array_values($arr)
<?php
// ① 键名相关
$arr = ['id'=>1, 'name'=>'admin', 'email'=> 'admin@php.cn'];
// $keys = [];
// echo key($arr);
// next($arr);
// echo key($arr);
// while ( key($arr)) {
// $keys[] = key($arr);
// next($arr);
// }
// print_r($keys);
// echo "<hr>";
//简化的方式获得所有的keys。
print_r(array_keys($arr));
//检查一个key是否存在?
echo array_key_exists('status', $arr) ? '存在' : '不存在', '<hr>';
// 拿到第一个key或最后一个key
echo array_key_first($arr);
echo array_key_last($arr);
// ② 与值相关
$arr = [3 => 10, 9 => 20, 0 => 'html', 'id' => 'css', 20 => 20, 30];
// print_r($arr);
// 获取所有值
// $valus = [];
// foreach ($arr as $value) {
// $values[] = $value;
// }
// print_r($values);
// array_values():返回数组的元素的值组成的索引数组
print_r(array_values($arr));
// echo in_array('css3', $arr) ? '找到了' : '没有', '<hr>';
// array_search():找到了返回元素值对应的键名,找不到返回布尔false
// var_dump(array_search('css3', $arr));
// 函数:功能, 参数, 返回值
// 去重
print_r(array_unique($arr));
$arr = [10, 20, 30,'123', '888php'];
echo array_sum($arr); //字符串也会转为数字 - 取其中的数据,但如果是字母先开始,则变为0。
echo array_product($arr); //所有相乘
2. 栈与队列
- 栈和队是两种现象,没有对应的名称之类的进行限定。
- 栈像“死胡同”,先进后出,后进先出;队则是“活胡同”,次序进出。
- ‘进’有两个:push(尾部进),unshift(头部进)。
- ‘出’有两个:pop(尾部出),shift(头部出)。
<?php
// 栈: 是添加与删除受限的一种数据结构,数据的增删仅允许在一端进行, LIFO,最后进最先出
$stack = [];
// 在栈的尾部进行增删
echo array_push($stack, 10, 20, 30);
print_r($stack);
echo '<br><hr>';
echo array_pop($stack); // 从最后一个逐步弹出,知道没有
echo array_pop($stack);
echo array_pop($stack);
var_dump(array_pop($stack));
echo '<br><hr>';
// 在栈的头部进行增删
echo array_unshift($stack, 'php', 'mysql');
print_r($stack);
echo '<br><hr>';
echo array_shift($stack);
echo array_shift($stack);
// 队: 先进先出FIFO
$queue = [];
// 尾部进队 + 头部出队, array_push + array+shift
// 尾部进队
array_push($queue, 10,20,30);
print_r($queue);
echo '<br><hr>';
// 头部出队,对照栈,栈尾部进,尾部出
echo array_shift($queue);
echo array_shift($queue);
echo array_shift($queue);
echo '<br><hr>';
// 头部进队+尾部出队 + , array_unshift + array+pop
// o:这种情况应该就是栈了。这是否也意味着array_push和array_unshift是一样的?
array_unshift($queue, 'one', 'two', 'three');
print_r($queue);
echo '<br>';
echo array_pop($queue);
echo array_pop($queue);
echo array_pop($queue);
echo array_pop($queue);//最后一个应该就没出了
echo '<br>';
print_r($queue); //里面就没有内容了
echo '<br><hr>';
//具体如图:
// 自己的一个测试
// ‘进’有两个:push(尾部进),unshift(头部进)
$train=[];
array_push($train,'1','2','3');
array_unshift($train,'four','five','six');
array_push($train,'7','8','9');
array_unshift($train,'ten');
print_r($train);
echo '<br><hr>';
// 自己的一个测试
// ‘出’有两个:pop(尾部进),shift(头部出)
array_pop($train);
array_shift($train);
array_pop($train);
array_shift($train);
print_r($train);
echo '<br><hr>';
// 应用-传统创建数组之外的另外一种方式
$arr = [];
array_push($arr, 'a');
array_push($arr, 'b');
array_push($arr, 'c');
print_r($arr);
//一种应用,例如形成一个url,或者从url中取&间隔开的参数等。
// http:://php.io/index.php?m=module&c=controller&a=add
3. 数组排序
<?php
$arr = [30, 4, 82, 15, 20, 'abc', 'hello', 2, 46];
// print_r($arr);
// 默认按值的升序
// sort($arr);
// asort($arr); // key跟着一起走,而非新生成一个
// print_r($arr);
$arr = ['e' => 10, 'a' => 30, 'p' => 50];
// print_r($arr);
// ksort($arr); // 按照key排序
// krsort($arr);
// print_r($arr);
$arr = [90, 33, 4, 10, 2, 12];
// print_r($arr);
// 用回调函数自定义排序,这样就可以在函数中增加一些复杂操作,例如不让某个单元出现等。
usort($arr, function($a, $b){
return $a - $b;
});
// 上面这个结果通过两个数的比较来实现排序,结果跟下面的直接sort是一样的。
sort($arr);
// print_r($arr);
// 自然排序
$arr = ['img1.jpg', 'img5.jpg', 'img10.jpg', 'img8.jpg'];
print_r($arr); //这种情况下10在8前面。
natsort($arr); //这种情况下则正常了。
4. 数组的切片(slice)及增删改(splice)
<?php
// array_slice(): 从数组中取出一部分元素
$stu = ['id' => 101, 'name' => '无忌', 'age' => 20, 'course' => 'php', 'grade' => 80];
// print_r($stu);
// $res = array_slice($stu, 0);
// $res = array_slice($stu, 0, 2);
// $res = array_slice($stu, 1, 3);
// $res = array_slice($stu, -3, 2); // 从-3位置开始取两个
// print_r($res);
// array_splice(&$arr, ....):实现增删改
$arr = [10, 28, 9, 33, 56, 21, 82, 47];
print_r($arr);
// 从第二个位置删除两个元素。
$res = array_splice($arr, 1, 2);
// 返回被删除的元素组成的数组
print_r($res);
// 返回剩下的arr
print_r($arr);
// 替换(删除并替换两个元素)
$res = array_splice($arr, 1, 2, [888, 999]);
// print_r($res);
// print_r($arr);
// 新增(从第二个位置新增两个新元素)
$res = array_splice($arr, 1, 0, [888, 999]);
print_r($res);
print_r($arr);
5. 数组的合并(array_combine)
<?php
$keys = ['type', 'host', 'dbname', 'username', 'password'];
$values = ['mysql', 'localhost', 'phpedu', 'root', 'root'];
print_r(array_combine($keys, $values));
// array_merge() // 这个没展开,后面自己查询下
6. 数组的回调函数(array_filter及array_map())
- array_filter: 对数组中的元素进行过滤
- array_map: 针对不同的数组元素进行不同的操作
<?php
// 1. array_filter():只返回元素可以转为为true的元素组成的数组
$arr = [150,'php', true,[4,5,6], (new class {}), [], null, false,'', 0, '0'];
$res = array_filter($arr, function($item){
return $item;
});
// [], null, false,'', 0, '0' : 转为false
// 也可以简化为下面这种写法
$res = array_filter($arr);
// 只返回标量,数组和对象等不返回
$res = array_filter($arr,function($item) {
return is_scalar($item);
});
// print_r($res);
//-----------------------------------------------
// array_map():为数组中的每个元素应用指定的回调函数进行处理,并返回新数组
$arr = ['php',[3,4,5], (new class {public $name='电脑';public $price=8888;}), 15, 20];
// 任务:如果数组元素是对象,则输出它的属性,如果是数组,则将它转为字符串输出,否则直接输出
$res = array_map(function($item){
//判断当前元素是否是对象或数组
switch (gettype($item)) {
case 'object':
$item = get_object_vars($item);
$item = implode(', ', $item);
// 这行及下一行(break)也可以取消掉,结果一样,但现在这种写法更容易理解
break;
case 'array':
$item = implode(', ', $item);// 将数组转化为以,分隔得字符串。
}
return $item;
}, $arr);
print_r($res);
- implode - 数组转化为字符串;
- extract - 关联数组转化为变量;
- compact - 将一组变量组装成关联数组
<?php
$arr = ['huawei', 'xiaome', 'apple', 'oppo', 'vivo'];
// implode(): 数组 --》 字符串
echo implode(', ', $arr); // 转化为用,分割的数组。
// extract(): 将关联数组拆分为变量
$config = ['type' => 'mysql', 'host' => 'localhost', 'dbname' => 'phpedu', 'charset' => 'utf8'];
// $type = 'mysql';
// $host = 'localhost';
// ....
// $host = $config['host'];
// $dbname = $config['dbname'];
// $charset = $config['charset'];
extract($config); // 例如针对post进来的一组输入进行操作。
echo $type, $host, $dbname, $charset;
// compact():将一组变量组装成关联数组
$id = 1;
$username = 'peter zhu';
$gender = '男';
print_r(compact('id','username', 'gender'));
8. 作业与实战
- 从今晚课程中, 自己选择一些认为比较感兴趣的函数进行编程练习并提交, 不少于10个
// ‘进’有两个:push(尾部进),unshift(头部进)
$train=[];
array_push($train,'1','2','3');
array_unshift($train,'four','five','six');
array_push($train,'7','8','9');
array_unshift($train,'ten');
print_r($train);
echo '<br><hr>';
// 自己的一个测试
// ‘出’有两个:pop(尾部出),shift(头部出)
array_pop($train);
array_shift($train);
array_pop($train);
array_shift($train);
print_r($train);
echo '<br><hr>';
// 应用-传统创建数组之外的另外一种方式
$arr = [];
array_push($arr, 'a');
array_push($arr, 'b');
array_push($arr, 'c');
print_r($arr);
echo '<br><hr>';
//---- 排序
asort($arr);
print_r($train);
echo '<br><hr>';
$slice = array_slice($train, 1,2);
print_r($slice);
echo '<br><hr>';
$addentry = array_splice($slice, 15, 0, ['bicycle', 'knift', 'plane']);
//这个地方增加新元素的地方尽管写的key值很大,也是从最后一个顺位去添加。
print_r($addentry);
print_r($slice);
echo '<br><hr>';
$keys = ['type', 'host', 'dbname', 'username', 'password'];
$values = ['mysql', 'localhost', 5, 3, [1,2]];
$new1 = array_combine($keys, $values);
$new2 = array_merge($keys, $values);
print_r($new1);
echo '<br>';
print_r($new2);
echo '<br><hr>';
$new3 = array_map(function($value){
switch(gettype($value)){
case 'intger':
$value = 0;
case 'array':
$value = 1;
case 'string':
$value = 9;
}
return $value;
}, $new2);
print_r($new3);