Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:编程, 看是学不会的, 必须动动手
<?php
// 数组的概述与分类
// 1. 索引数组
// 索引键名是数值
$students = [0=>'1111', 1=>'zhangsan', 2=>'网络编程', 3=>4400];
printf('<pre>%s</pre>', print_r($students, true));
// 如果索引数组的键名满足从0开递增的正整数,可以省略
$students = ['1111', 'zhangsan', '网络编程', 9999];
// printf('<pre>%s</pre>', print_r($students, true));
// 键名可以不连续, 可以是负数, 还可以是小数
$students = ['1111', 5=>'zhangsan', 6=>'网络编程',7=>4400];
// printf('<pre>%s</pre>', print_r($students, true));
// 2. 关联数组
// 键名用非数字的字符串来表示
$students = ['id'=>'1111', 'name'=>'zhangsan', 'model'=>'网络编程', 'price'=>4400];
printf('<pre>%s</pre>', print_r($students, true));
// 如果采用数字字符串,那么索引数组其实也是关联数组
$students = ['0'=>'1111','1'=>'zhangsan', '2'=>'网络编程', '3'=>4400];
printf('<pre>%s</pre>', print_r($students, true));
echo $students[1], $students['1'];
// 所以, 可以认为索引数组是关联数组的子集, 一个分支
$students = ['3'=>'1111','name'=>'zhangsan', 10=>'网络编程', 'price'=>4400];
printf('<pre>%s</pre>', print_r($students, true));
// 数组的定义与访问
// 索引数组,array()
$students1 = array('1111','zhangsan',[90,80]);
printf('<pre>%s</pre>',print_r($students1,true));
echo '<hr>';
// 使用方括号,逐个创建数组成员/元素
// 使用数组成员的更新/赋值的语法来创建
// 关联数组
$students2 = ['id'=>'1111','name'=>'zhangsan','scores'=>['php'=>90,'js'=>80]];
printf('<pre>%s</pre>',print_r($students2,true));
echo '<hr>';
// 数组成员的访问方式
// 索引数组成员
// echo "students1[1] 的姓名: students1[2]<br>";
// 关联数组成员
// echo "{students2['name']} 的成绩: {students2['scores']}<br>";
// 数组成员的类型, 类型不受限制
// 数组的值如果仍然是数组的话, 就创建了一个多维数组,多维数组中最常用的就是二维数组
// 因为从数据表查询的结果, 大多以二维数组的形式呈现
echo $students2['scores']['php'];
echo '<hr>';
// 数组的遍历
// 1. 逐个遍历
// 利用数组内部的指针
//$stu = ['id'=>'1111', 'name' => 'zhangsan', 'age' => 35, 'course' => 'php', 'grade' => 68];
// 在没有遍历之前,数组指针指向第一个元素
// current(): 当前数组成中的值, key()
// printf('[ %s ] => %s<br>', key($stu), current($stu));
// next($stu);
// printf('[ %s ] => %s<br>', key($stu), current($stu));
// next($stu);
// printf('[ %s ] => %s<br>', key($stu), current($stu));
// next($stu);
// printf('[ %s ] => %s<br>', key($stu), current($stu));
// prev($stu);
// printf('[ %s ] => %s<br>', key($stu), current($stu));
// end($stu);
// printf('[ %s ] => %s<br>', key($stu), current($stu));
// reset($stu);
// printf('[ %s ] => %s<br>', key($stu), current($stu));
// 2. 自动遍历
$stu = ['id'=>'1111', 'name' => 'zhangsan', 'age' => 35, 'course' => 'php', 'grade' => 68];
// reset($stu);
// while (true) {
// printf('[ %s ] => %s<br>', key($stu), current($stu));
// if (next($stu)) {
// continue;
// } else {
// break;
// }
// }
// 只获取数组成员的值
foreach($stu as $value){
printf('%s***<br>',$value);
}
echo '<hr>';
// 获取数组成员的键与值
foreach($stu as $key=>$value){
printf('[%s]=>%s###<br>',$key,$value);
}
echo '<hr>';
$users =null;
$users[0] = ['id'=>'1010', 'name'=>'zhangsan', 'age'=>88];
$users[1] = ['id'=>'1020', 'name'=>'lisi', 'age'=>78];
$users[2] = ['id'=>'1030', 'name'=>'wangwu', 'age'=>68];
// 一般遍历二维数组,我们只关心值
// foreach ($users as $user) {
// printf('id: %s---name: %s---age: %s<br>', $user['id'], $user['name'], $user['age']);
// }
echo '<hr>';
// 用list()对数组进行解构来遍历
foreach ($users as list('id'=> $id, 'name'=> $name, 'age'=>$age)) {
// printf('id: %s******name: %s******age: %s<br>', $id, $name, $age);
}
echo '<hr>';
$staffs = null;
$staffs[] = ['2020', 'zhangsan', 29, [67, 88]];
$staffs[] = ['2021', 'lisi', 39, [99, 31]];
$staffs[] = ['2022', 'wangwu', 49, [56, 63]];
foreach ($staffs as list($id, $name, $age, list($js, $php) )) {
printf('id => %s, name => %s, age => %s, js=> %s, php=>%s<br>', $id, $name, $age, $js, $php);
}
echo '<hr>';
// foreach(): 遍历对象
$obj = new stdClass();
$obj->name = 'admin';
$obj->email = 'admin@php.cn';
$obj->role = 'custom';
foreach ($obj as $prop => $value) {
printf('[ %s ] => %s<br>', $prop, $value);
}
// 与值相关的函数
// array_values($arr):返回数据中所有成员的值组成的数组,会将键名重置
$arr = [3=>10, 9=> 20, 0 => 'html', 'id' => 'css', 20 => 20, 30];
print_r($arr);
echo '<br>';
print_r(array_values($arr));
echo '<hr>';
// in_array($search, $arr): 检查某个元素是否存在于指定的数组中
echo (in_array('html5', $arr) ? '存在' : '没有') . '<br>';
// array_search($search, $arr): 搜索指定的值, 返回的是键名
echo $key = array_search('css', $arr);
echo $arr[$key];
echo '<hr>';
// array_unique($arr): 删除重复的值, "去重"函数
$newArr = array_unique($arr);
print_r($newArr);
// 与统计相关
// count($arr): 数组成员数量
$arr = [10, 3, 5, 3, 10, 5, 7, 3, 10, 7, 7];
printf('<pre>%s</pre>', print_r($arr,true));
echo '数组成员的数量: ' . count($arr);
// array_count_values($arr): 统计数组中某个值的出现的频率
$res = array_count_values($arr);
printf('<pre>%s</pre>', print_r($res,true));
// 与计算相关
$arr = [10,20,'php50', '50php',30];
// '50php': 将开头的数字字符串解析出来,'php50'
// 求和
echo array_sum($arr). '<hr>';
// 计算乘积
$arr = [10,20, '50php',30];
// 'php50'被解析为0
echo array_product($arr);
echo '<hr>';
// 栈与队列
// 栈: 后进先出, 最后进入的最先出来, LIFO, 添加与删除受限,只允许在一端进行
// 队列: 先进先出, 最先插入的数据最先出来, FIFO, 添加与删除允许在二端进行
// 1. 栈操作: 尾部进行添加与删除
$stack = [];
// 进栈: array_push($arr, $data,...): 返回的是当前数组中被添加成功的元素的数量
echo array_push($stack,10) . '<br>';
echo array_push($stack,20, 30) . '<br>';
printf('<pre>%s</pre>', print_r($stack, true));
// echo '<hr>';
// 出栈: array_pop($stack): 返回的是出栈的元素
echo array_pop($stack) . '<br>';
// echo array_pop($stack) . '<br>';
// echo array_pop($stack) . '<br>';
// var_dump(array_pop($stack));
// echo '<hr>';
// 2. 栈操作: 头部进行添加与删除
// 入栈: array_unshift($arr, $data,...)
// echo array_unshift($stack, 'one'). '<br>';
// echo array_unshift($stack, 'three', 'two'). '<br>';
// printf('<pre>%s</pre>', print_r($stack, true));
// echo '<hr>';
// 出栈: array_shift($stack), 返回元素
// echo array_shift($stack) . '<br>';
// echo array_shift($stack) . '<br>';
// echo array_shift($stack) . '<br>';
// var_dump(array_shift($stack));
// echo '<hr>';
// 3. 队列操作:
// 尾部进队, 头部出队: array_push() + array_shift()
$queue = [];
echo array_push($queue, 10, 20, 30);
printf('<pre>%s</pre>', print_r($queue, true));
echo '<hr>';
echo array_shift($queue) . '<br>';
echo array_shift($queue) . '<br>';
echo array_shift($queue) . '<br>';
// 头部进队, 尾部出队: array_unshift() + array_pop()
echo '<hr>';
echo array_unshift($queue, 'one', 'two', 'three').'ddddd';
printf('<pre>%s</pre>', print_r($queue, true));
echo '<hr>';
echo array_pop($queue) . '<br>';
echo array_pop($queue) . '<br>';
echo array_pop($queue) . '<br>';
// 排序: 参数数组引用传参
// 1. 对值
$arr = [30, 4, 82, 15, 20, 'abc', 'hello', 2, 46];
// printf('原始数组:<pre>%s</pre><hr>', print_r($arr, true));
// 1.1 升序
sort($arr);
printf('升序索引重置:<pre>%s</pre><hr>', print_r($arr, true));
// // 1.2 升序,但索引不变
// $arr = [30, 4, 82, 15, 20, 'abc', 'hello', 2, 46];
// // a: asoc
// asort($arr);
// printf('升序索引不变:<pre>%s</pre><hr>', print_r($arr, true));
// 1.2 降序
// rsort($arr);
// printf('降序索引重置:<pre>%s</pre><hr>', print_r($arr, true));
// // 2.2 升序,但索引不变
// $arr = [30, 4, 82, 15, 20, 'abc', 'hello', 2, 46];
// // a: asoc
// arsort($arr);
// printf('降序索引不变:<pre>%s</pre><hr>', print_r($arr, true));
// 2. 对键名排序
// $arr = ['e' => 10, 'a' => 30, 'p' => 50];
// // 按键名升序, k: key
// ksort($arr);
// printf('按键名升序:<pre>%s</pre><hr>', print_r($arr, true));
// // 键名降序
// $arr = ['e' => 10, 'a' => 30, 'p' => 50];
// krsort($arr);
// printf('按键名降序:<pre>%s</pre><hr>', print_r($arr, true));
// 3. 自定义排序
// $arr = [90, 33, 4, 10, 2, 12];
// // 自定义升序:u: user
// usort($arr, function($a, $b) {
// return $a - $b;
// });
// printf('自定义升序:<pre>%s</pre><hr>', print_r($arr, true));
// // 自定义降序:u: user
// $arr = [90, 33, 4, 10, 2, 12];
// usort($arr, function($a, $b) {
// return $b - $a;
// });
// printf('自定义降序:<pre>%s</pre><hr>', print_r($arr, true));
// 4. 自然排序
// $arr = ['img1.jpg', 'img5.jpg', 'img10.jpg', 'img8.jpg'];
// sort($arr);
// printf('升序:<pre>%s</pre><hr>', print_r($arr, true));
// echo '<hr>';
// // 自然排序
// $arr = ['img1.jpg', 'img5.jpg', 'img10.jpg', 'img8.jpg'];
// natsort($arr);
// printf('自然升序:<pre>%s</pre><hr>', print_r($arr, true));
// 5. 乱序反转
$arr = ['id' => 109, 'username' => 'peter', 'age' => 27, 'salary' => 99999];
// 打乱
// shuffle($arr);
// printf('乱序:<pre>%s</pre><hr>', print_r($arr, true));
$arr = array_reverse($arr);
printf('反转:<pre>%s</pre><hr>', print_r($arr, true));
// 交换键值
$arr = ['name' => 'admin', 'age' => 30, 'salary' => 8888];
$arr = ['name' => 'admin', 'age' => 30, 'salary' => false];
$arr=@array_flip($arr);
printf('交换:<pre>%s</pre><hr>', print_r($arr, true));
//10个课堂未讲过的函数
//查询与替换
//从数组中随机取出一个或多个元素
$input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank");
$rand_keys = array_rand($input, 2);
echo $input[$rand_keys[0]] . '<br>';
echo $input[$rand_keys[1]] . '<br>';
//获取多维数组中一列组成的新数组
$records = array(
array(
'id' => 2135,
'first_name' => 'John',
'last_name' => 'Doe',
),
array(
'id' => 3245,
'first_name' => 'Sally',
'last_name' => 'Smith',
),
array(
'id' => 5342,
'first_name' => 'Jane',
'last_name' => 'Jones',
),
array(
'id' => 5623,
'first_name' => 'Peter',
'last_name' => 'Doe',
)
);
$first_names = array_column($records, 'first_name');
print_r($first_names);
echo '<hr>';
//使用后面数组的值替换第一个数组的值
$base = array("orange", "banana", "apple", "raspberry");
$replacements = array(0 => "pineapple", 4 => "cherry");
$replacements2 = array(0 => "grape");
$basket = array_replace($base, $replacements, $replacements2);
print_r($basket);
echo '<hr>';
//使用传递的数组递归替换第一个数组的元素
//array_replace_recursive()
//计算数组的交集
$array1 = array("a" => "green", "red", "blue");
$array2 = array("b" => "green", "yellow", "red");
$result = array_intersect($array1, $array2);
print_r($result);
echo '<hr>';
//返回数组的交集,键名也做比较
$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "green", "b" => "yellow", "blue", "red");
$result_array = array_intersect_assoc($array1, $array2);
print_r($result_array);
echo '<hr>';
//计算数组的差集
//对比 array1 和其他一个或者多个数组,返回在 array1 中但是不在其他 array 里的值。
$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);
print_r($result);
echo '<hr>';
//返回数组的差集,键名也做比较
//array_diff_assoc()
//分割与合并
//通过合并两个数组来创建一个新数组
//创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
$a = array('green', 'red', 'yellow');
$b = array('avocado', 'apple', 'banana');
$c = array_combine($a, $b);
print_r($c);
echo '<hr>';
//把一个或多个数组合并为一个数组
//array_merge() 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。
//如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。
//如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);
print_r($result);
echo '<hr>';
//将一个数组分割成多个子数组
//array_chunk()参数中preserve_keys
//设为 TRUE,可以使 PHP 保留输入数组中原来的键名。如果你指定了 FALSE,那每个结果数组将用从零开始的新数字索引。默认值是 FALSE。
$input_array = array('a', 'b', 'c', 'd', 'e');
print_r(array_chunk($input_array, 2));
print_r(array_chunk($input_array, 2, true));
echo '<hr>';
//自动生成
//根据范围创建数据,包含指定的元素
//range ( mixed $start , mixed $end [, number $step = 1 ] ) : array
//建立一个包含指定范围单元的数组。
//参数:start,序列的第一个值。 end,序列结束于 end 的值。
// step,如果设置了步长 step,会被作为单元之间的步进值。step 应该为正值。不设置step 则默认为 1。
//返回值,返回的数组中从 start 到 end (含 start 和 end)的单元。
// array(0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
foreach (range(0, 100, 10) as $number) {
echo $number;}
echo '<hr>';
//用给定的值填充数组
//array_fill ( int $start_index , int $num , mixed $value ) : array
//array_fill() 用 value 参数的值将一个数组填充 num 个条目,键名由 start_index 参数指定的开始。
$a = array_fill(5, 6, 'banana');
$b = array_fill(-2, 4, 'pear');
print_r($a);
print_r($b);
echo '<hr>';
//使用指定的键和值填充数组
//array_fill_keys()
//以指定长度将一个值填充进数组
//array_pad() 返回 array 的一个拷贝,并用 value 将其填补到 size 指定的长度。
//如果 size 为正,则填补到数组的右侧,如果为负则从左侧开始填补。
//如果 size 的绝对值小于或等于 array 数组的长度则没有任何填补。有可能一次最多填补 1048576 个单元。
$input = array(12, 10, 9);
$result = array_pad($input, 5, 0);
// result is array(12, 10, 9, 0, 0)
$result = array_pad($input, -7, -1);
// result is array(-1, -1, -1, -1, 12, 10, 9)
$result = array_pad($input, 2, "noop");
// not padded
echo '<hr>';
//类型转换
//将数组中的值赋予一组变量(类似解构赋值)
//像 array() 一样,这不是真正的函数,而是语言结构。 list() 可以在单次操作内就为一组变量赋值。
$info = array('coffee', 'brown', 'caffeine');
// 列出所有变量
list($drink, $color, $power) = $info;
echo "$drink is $color and $power makes it special.\n";
echo '<hr>';
//将数组元素按指定字符拼装成字符串
$array = array('lastname', 'email', 'phone');
$comma_separated = implode(",", $array);
echo $comma_separated;
echo '<hr>';
//将字符串分割为数组
//explode()
$pizza = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2
echo '<hr>';
//将关联数组拆分成变量名值对
//假定 $var_array 是 wddx_deserialize 返回的数组
$size = "large";
$var_array = array("color" => "blue",
"size" => "medium",
"shape" => "sphere");
extract($var_array, EXTR_PREFIX_SAME, "wddx");
echo "$color, $size, $shape, $wddx_size\n";
echo '<hr>';
//将一直变量名值对拼装成一个关联数组的键值对
//compact() 接受可变的参数数目。
//每个参数可以是一个包括变量名的字符串或者是一个包含变量名的数组,
//该数组中还可以包含其它单元内容为变量名的数组, compact() 可以递归处理。
$city = "San Francisco";
$state = "CA";
$event = "SIGGRAPH";
$location_vars = array("city", "state");
$result = compact("event", "nothing_here", $location_vars);
print_r($result);
echo '<hr>';
// 查询与替换
// 1. array_slice($arr, $offset, $length, $flag): 从数组取出一部分
// $stu = ['id' => 101, 'name' => '无忌', 'age' => 20, 'course' => 'php', 'grade' => 80];
// $res = array_slice($stu, 0);
// 获取前2个
// $res = array_slice($stu, 0, 2);
// 从第2个索引开始取3个
// $res = array_slice($stu, 1, 3);
// 第2个参数支持负数, 从倒数第3个,取2个
// $res = array_slice($stu, -3, 2);
// $res = array_slice($stu, 1, -1);
// $res = array_slice(array_values($stu), 1, -1 , false);
// $stu = array_values($stu);
// $res = array_slice($stu, 1, -1 , true);
// printf('<pre>%s</pre><hr>', print_r($res, true));
// 2. array_splice(&$arr, ):删除数组中的一部分并用其它值代替
// 可以实现对数组的: 删除, 替换/更新, 添加
$arr = [10, 28, 9, 33, 56, 21, 82, 47];
printf('原始数组元素: <pre>%s</pre>', print_r($arr, true));
// 删除元素
// array_splice($arr, 起始索引, 删除数量), 返回的是被删除元素组成的数组
// $res=array_splice($arr, 1, 2);
// printf('<pre>%s</pre><hr>', print_r($res, true));
// 替换功能
// $res=array_splice($arr, 1, 2, [888, 999]);
// $res=array_splice($arr, 1, 2, [888]);
// $res=array_splice($arr, 1, 2, 888);
// 添加
// $res=array_splice($arr, 1, 0, [888, 999]);
// 负数
// $res=array_splice($arr, -3, 2, [888, 999]);
$res=array_splice($arr, -4, -2, [888, 999]);
printf('删除的元素: <pre>%s</pre><hr>', print_r($res, true));
printf('当前: <pre>%s</pre><hr>', print_r($arr, true));
// 数组元素回调处理
// 1.array_filter(): 用回调过滤数组中的单元,返回计算结果为true的元素组成的数组
$arr = [150, 'php',true,[4,5,6], (new class {}), [], null, false, '', 0, '0'];
// php自动转为false的值: null, false, 空数组, 空字符串, 0, '0'
// 提示: 空对象不能转为false, 但是空数组是false
$res = array_filter($arr,function($item){
return $item;
});
$res = array_filter($arr);
$res = array_filter($arr,function($item){
// 只返回标量的数据
// 标量: 单值变量(简单类型,string, int,float,boolean), 数组,对象不是,它们是复合
return is_scalar($item) ;
});
// printf('<pre>%s</pre><hr>', print_r($res, true));
// echo '<hr>';
// 2. 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);
case 'array':
$item = implode(', ', $item);
}
return $item;
}, $arr);
// printf('<pre>%s</pre><hr>', print_r($res, true));
echo '<hr>';
// array_map(): 同时处理多个数组
$key = ['host', 'username', 'password'];
$values = ['localhost', 'root', '123456'];
// $res = array_combine($key, $values);
$res = array_map(function($value1, $value2) {
return [$value1 => $value2];
}, $key, $values);
printf('<pre>%s</pre><hr>', print_r($res, true));
echo $res[2]['password'];
echo '<hr>';
// 3. array_reduce(): 迭代处理数组元素
function my_array_reduce($array, $callback, $init=null) {
// $prev
$prev = $init;
foreach ($array as $current) {
$prev = $callback($prev,$current);
}
return $prev;
}
$result=my_array_reduce($res, function($prev, $current){
// 获取当前元素的键
$key = key($current);
// 获取当前元素的值
$value = current($current);
// 拼装成键值对
$prev[$key] = $value;
return $prev;
});
// printf('自定义迭代:<pre>%s</pre><hr>', print_r($result, true));
echo '<hr>';
$res=array_reduce($res, function($prev, $current){
// 获取当前元素的键
$key = key($current);
// 获取当前元素的值
$value = current($current);
// 拼装成键值对
$prev[$key] = $value;
return $prev;
});
// printf('内置的数组迭代:<pre>%s</pre><hr>', print_r($res, true));
// 4. array_walk(): 使用自定义回调对数组中成员逐个处理,返回布尔值
// 主要用于数组成员 的格式化, 不受数组指针影响
$res = ['id'=>10, 'name'=>'admin', 'email'=>'admin@php.cn'];
// array_walk(数组, 回调,回调的第三个数组的默认值)
array_walk($res, function($value, $key, $color) {
printf('[ %s ] => <span style="color:%s">%s</span><br>',$key,$color, $value );
},'green');
利用五一假期的时间,对前的学习的数组及函数相关内容进行了较为全面地复习,包括回看视频及讲义代码,对照函数大全,尝试着逐个函数去实现一下,鉴于函数内容众多,部分参考老师授课实例,部分自己举例,部分借鉴技术手册案例,虽然这样全面地复习比较费时费力,但完成后,特别是上课时感觉没怎么听懂的地方,通过复习,基本知识点都能消化了,还是感觉内心很充实。希望将面向对象部分内容也能做这样的总结,但时间有限,也需要从方式方法上做些调整,尽量提高学习效率。