数组api 获取键与值
<?php
namespace _0811;
// 注意箭头函数后面有空格
$stu = ['id'=> 1 , 'name'=> '小狗' , 'score' => 89];
// key():键名
// current() 当前值
printf( '[%s] =>%s<br>',key($stu),current($stu));
// printf( '[%s] =>%s<br>',key($stu),current($stu));
// 数组指针后移
// next($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));
// next($stu);
// printf('[ %s ] => %s<br>', key($stu), current($stu));
// prev()指针后移
prev($stu);
printf('[ %s ] => %s<br>', key($stu), current($stu));
//reset()指针重置 指向第一个
reset($stu);
printf('[ %s ] => %s<br>', key($stu), current($stu));
//end()指针 指向第最后一个
end($stu);
printf('[ %s ] => %s<br>', key($stu), current($stu));
// 自动操作
// for foreach
echo '<hr>';
reset($stu);
if (count($stu)>0){
while(true){
printf('[ %s ] => %s<br>', key($stu), current($stu));
if(next($stu)){
continue;
}else{
break;
}
}
}else {
echo '空';
}
echo '<hr>';
// foreach 简化
reset($stu);
foreach ($stu as $key=>$value){
printf('[ %s ] => %s<br>', $key, $value);
}
echo '<hr>';
// 解构、
// list( )
// 索引数组解构
list ($name,$price) =['手机',5000];
echo $name ,',' ,$price;
echo $name, $price;
// 关联数组
// 模板
echo '<hr>';
// 注意索引必须一致 ,对象可以不一样,但是建议一样
list('name'=>$a, 'price'=>$b) =['name'=>'电脑','price'=> 9000];
echo $a, $b;
echo '<hr>';
// 框架使用 extract 模板赋值 方便
extract(['name'=>'相机','price'=> 19000]);
echo $name, $price;
echo '<hr>';
// foreach + list解构
// 用二维数组来模拟数据表查询结果
$users = [
['id' => 5, 'name' => '小麦'],
['id' => 8, 'name' => '小狗'],
['id' => 14, 'name' => '小猫'],
];
foreach($users as $uer){
print_r($uer).'<br>';
vprintf('id=%s,name=%s',$uer);
}
echo '<hr>';
// list('id'=>$id, 'name'=>$name) =['id'=>'5','name'=> '小麦'];
foreach($users as list('id'=>$id, 'name'=>$name)){
printf('id=%s,name=%s<br>',$id,$name);
}
数组api 键的查询;值的去重、求和、求积
<?php
namespace _0811;
// 与值相关
// array values () 将数组的值。组成一个新数组 键名会重置
$arr = [0=>1, 5=>88, 3=>'js', 2=>'php', 6=>98];
// 增删改查后 键名会乱掉
printf('<pre>%s</pre>',print_r($arr,true));
print_r(array_values($arr));
printf('<pre>%s</pre>',print_r(array_values($arr)),true);
echo '<hr>';
// in_array()查询 某个元素是否在这个数组内 返回布尔值 true false
echo(in_array('ph',$arr)?'找到了':'没有');
echo '<hr>';
// array_search() 查询 键
$key = array_search('js',$arr);
echo $key;
echo '<hr>';
// array_unique( ) 去重 后返回新数组
// @ 去掉报错
print_r( array_unique($arr));
echo '<hr>';
printf('<pre>%s</pre>',print_r(array_unique($arr)),true);
echo '<hr>';
// count( ) 统计当前数组数量
echo count($arr);
// array_count_values(),统计某个值的出现频率
$arr = [0=>1, 5=>88, 3=>'js', 2=>'php', 6=>88];
printf('<pre>%s</pre>', print_r(array_count_values($arr), true));
echo array_sum($arr);
echo '<hr>';
// 计算求值操作 array_sum 字符串 不被计算在内 当数字+字符串组成 只算数组 字符串忽略
$arr = [0=>1, 5=>88, 3=>'10js', 2=>'php', 6=>88];
echo array_sum($arr);
echo '<hr>';
// 求乘积 字符串 就是解析为 0 加法 可以乘法就出错了
echo array_product($arr) . '<br>';
echo '<hr>';
$arr = [0=>1, 5=>88, 3=>'10js', 2=>'1php', 6=>88];
echo array_product($arr) . '<br>';
数组api 值的队列
<?php
namespace _0811;
// 栈操作: 成员的增删,只允许在数组的一端进行
// 本质上是增删受限的操作
// push()尾部追加 pop()尾部删除 js php 前面加array_
$arr = [];
echo array_push($arr,10,20,30);
echo '<hr>';
print_r( $arr);
echo '<hr>';
print_r( array_push($arr,40,50,60));
echo '<hr>';
print_r( $arr);
echo '<hr>';
echo array_pop($arr);
echo '<hr>';
print_r( $arr);
// unshift()头部追加 shift()头部删除 js php 前面加array_
echo '<hr>';
echo array_unshift($arr);
echo '<hr>';
echo array_unshift($arr,90,80);
echo '<hr>';
print_r( $arr);
echo '<hr>';
echo array_unshift($arr,70);
echo '<hr>';
print_r( $arr);
echo '<hr>';
echo array_shift($arr);
echo '<hr>';
print_r( $arr);
echo '<hr>';
// 队列:
// 1. 尾部追加, 头部删除
// array_push(), array_shift()
echo array_push($arr,110);
print_r( $arr);
echo '<hr>';
echo array_shift($arr);
echo '<hr>';
print_r( $arr);
// 2. 头部追加, 尾部删除
// array_unshift(), array_pop()
echo '<hr>';
echo array_unshift($arr,120);
print_r( $arr);
echo '<hr>';
echo array_pop($arr);
echo '<hr>';
print_r( $arr);
数组api 值的排序
<?php
namespace _0811;
$arr = [30, 4, 82, 15, 20, 'abc', 'hello', 2, 46];
printf('<pre>%s</pre>', print_r($arr, true));
echo '<hr>';
// 排序
// 1. 值排序
// 升序 默认按照ASCII码 键重置
sort($arr);
printf('<pre>%s</pre>', print_r($arr, true));
echo '<hr>';
// 升序 键名不重置
$arr = [30, 4, 82, 15, 20, 'abc', 'hello', 2, 46];
asort($arr);
printf('<pre>%s</pre>', print_r($arr, true));
echo '<hr>';
// 降序 键重置
rsort($arr);
printf('<pre>%s</pre>', print_r($arr, true));
echo '<hr>';
// 降序 键不重置
$arr = [30, 4, 82, 15, 20, 'abc', 'hello', 2, 46];
arsort($arr);
printf('<pre>%s</pre>', print_r($arr, true));
echo '<hr>';
sort($arr);
printf('<pre>%s</pre>', print_r($arr, true));
echo '<hr>';
// 2. 键排序
// ksort($arr);
// krsort($arr);
ksort($arr);
printf('<pre>%s</pre>', print_r($arr, true));
echo '<hr>';
krsort($arr);
printf('<pre>%s</pre>', print_r($arr, true));
echo '<hr>';
// 自定义排序规则
// usort() 两个值
$arr = [90,33,2,184, 24, 3];
usort($arr,function($a,$b){
// 升序
return $a -$b;
});
printf('<pre>%s</pre>', print_r($arr, true));
$arr = [90,33,2,184, 24, 3];
usort($arr,function($a,$b){
// 降序
return $b -$a;
});
printf('<pre>%s</pre>', print_r($arr, true));
// 打乱
// shuffle() 每次结果不一样
shuffle($arr);
printf('<pre>%s</pre>', print_r($arr, true));
数组api 查询替换
<?php
namespace _0811;
// 跟js 类似 js 是传字符串 php 传数组
// 查询与替换
// array_slice() 取出一部分成员 支持反向取值 负号
$stu = [
'id' => 101,
'name' => '无忌',
'age' => 20,
'course' => 'php',
'grade' => 80
];
$res = array_slice( $stu,2,3);
printf('<pre>%s</pre>', print_r($res, true));
echo '<hr>';
$res = array_slice($stu,-5,2);
printf('<pre>%s</pre>', print_r($res, true));
echo '<hr>';
// array_splice(): 增删改 默认功能是: 删除
$arr = [10, 28, 9, 33, 56, 21, 82, 47];
printf('原始数组元素: <pre>%s</pre>', print_r($arr, true));
echo '<hr>';
// 默认功能是: 删除
print_r(array_splice($arr ,1,3)) ;
echo '<hr>';
printf('删除后剩余的数组元素: <pre>%s</pre>', print_r($arr ,true));
echo '<hr>';
// 替换功能是:
$res=array_splice($arr, 1, 2, [666,999]);
printf('替换后的数组元素: <pre>%s</pre>', print_r($arr ,true));
// 增加 不删除就是增加 size =0 s
$res=array_splice($arr, 1, 0, [666,999]);
printf('增加后的数组元素: <pre>%s</pre>', print_r($arr ,true));
数组api回调
<?php
namespace _0811;
//数组 回调
$arr = [
150,
'php',
true,
[4, 5, 6],
(new class () {
}),
[],
null,
false,
'',
0,
'0'
];
// array_filter(),只返回数组中为true的元素组成的数组 数组过滤器
print_r(array_filter($arr)) ;
echo '<hr>';
$res =array_filter($arr);
printf('<pre>%s</pre>',print_r($res,true) );
// php自动转为false的值: null, false, 空数组, 空字符串, 0, '0'
// 提示: 空对象不能转为false, 但是空数组是false
echo '<hr>';
$res1 =array_filter($arr,function($item){
// 只返回标量/基本数据类型
return is_scalar($item);
});
printf('<pre>%s</pre>',print_r($res1,true) );
echo '<hr>';
printf('<pre>%s</pre>',print_r(array_filter($res1),true) );
echo '<hr>';
// array_map() 对每个成员 ,做回调处理,返回新数组
$arr = [
'php',
[3, 4, 5],
(new class () {
public string $name = '电脑';
public int $price = 8888;
}),
15,
20
];
// 拉平
$res2 = array_map(function($item) {
switch (gettype($item)) {
case 'array':
$item = implode(',', $item);
break;
case 'object':
// get_object_var 返回对象里面的变量 属性
$item = get_object_vars($item);
break;
}
return $item;
},$arr);
printf('<pre>%s</pre>', print_r($res2, true));
echo '<hr>';
// 重复拉平
$arr = [
'php',
[3, 4, 5],
(new class () {
public string $name = '电脑';
public int $price = 8888;
}),
15,
20
];
$res3 = array_map(function($item) {
switch (gettype($item)) {
case 'array':
$item = implode(',', $item);
break;
case 'object':
// get_object_var 返回对象里面的变量 属性
$item = implode(',', get_object_vars($item));
break;
}
return $item;
},$arr);
printf('<pre>%s</pre>', print_r($res3, true));
echo '<hr>';
// array_reduce(): 迭代/归并处理函数
$arr = [1,2,3,4,5,6];
// 求和
echo array_sum($arr);
echo '<hr>';
// 归并求和
$res4 = array_reduce($arr,function ( $acc,$cur){
echo $acc , '___',$cur.'<br>';
return $acc +$cur;
// 从多少基础上叠加
},1000);
echo '<hr>';
echo $res4;
echo '<hr>';
// 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');