1、指针
<?php
namespace _0811;
$stu = ['id'=>1,'name'=>'jack','course'=>'php','score'=>90];
//key():当前键名
//current:当前值
printf('[%s]=>%s',key($stu),current($stu));
echo '<hr>';
//next():指针前移
next($stu);
printf('[%s]=>%s',key($stu),current($stu));
echo '<hr>';
next($stu);
printf('[%s]=>%s',key($stu),current($stu));
echo '<hr>';
next($stu);
printf('[%s]=>%s',key($stu),current($stu));
echo '<hr>';
// next($stu);
//走到头以后返回false
// printf('[%s]=>%s',key($stu),current($stu));
// echo '<hr>';
//prev():指针后移
prev($stu);
printf('[%s]=>%s',key($stu),current($stu));
echo '<hr>';
//reset():指针重置,指向第一个
reset($stu);
printf('[%s]=>%s<hr>',key($stu),current($stu));
//end():指针重置,指向最后一个
end($stu);
printf('[%s]=>%s<hr>',key($stu),current($stu));
//连续输出
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进行简化
//key = key($stu),$value = current($stu)
foreach($stu as $key=>$value){
printf('[%s]=>%s<br>',$key,$value);
}
echo '<hr>';
//用list解构
//索引数组结构
list($name,$price) = ['手机',5000];
echo $name . ',' . $price . '<hr>';
//关联数组如何解析呢?
//关联数组解构时,需要在list里写入模板.list里的$list和$price可以自定义
list('name'=>$name,'price'=>$price) = ['name'=>'电脑','price'=>8000];
echo $name . ',' . $price . '<hr>';
//extract与list作用类似
extract(['name'=>'相机','price'=>10000]);
echo $name . ',' . $price . '<hr>';
//foreach + list
//用二维数组来模拟数据表查询结果
$users = [
['id'=>5,'name'=>'Mike'],
['id'=>8,'name'=>'John'],
['id'=>14,'name'=>'Jerry'],
];
//!注意 foreach(A as B) 时,A不能等于B
foreach($users as $user){
//$value是一个数组
// print_r($value);
vprintf('id= %s,name= %s<br>',$user);
}
/**
* vprintf和printf都是(模板,数据)的格式
* 其区别在于:vprintf数据可以是数组,模板可以依次读取,printf不行,必须一个一个写变量
*/
echo '<hr>';
foreach($users as list('id'=>$id,'name'=>$name)){
//$value是一个数组
// print_r($value);
printf('id = %s, name = %s<br>',$id,$name);
}
echo '<hr>';
上述运行结果:
2、数组API
<?php
namespace _0811;
//与值相关
//array_values():将数组的值,组成一个新数组,键名会重置
$arr = [0=>1,1=>88,2=>88,3=>'php',5=>true,6=>[1,2,3]];
printf('<pre>%s</pre>',print_r($arr,true));
echo '<hr>';
printf('<pre>%s</pre>',print_r(array_values($arr),true));
echo '<hr>';
//in_array():查询某个元素是否在这个数组中,返回true/false
echo (in_array('php',$arr)?'找到了':'没有');
echo '<hr>';
//array_search()
$key = array_search('php',$arr);
echo $key;
echo '<hr>';
echo $key . ',' . $arr[$key];
echo '<hr>';
//array_unique():去重
//加@可以取消报错
@printf('<pre>%s</pre>',print_r(array_unique($arr),true));
echo count($arr) . '<br>';
//array_count_values(),统计出某个值的出现频率,且只能计算 STRING 和 INTEGER 值!
@printf('<pre>%s</pre>',print_r(array_count_values($arr),true));
$arr1 = [0=>1,1=>88,2=>88,3=>'10php',5=>true,6=>88];
//字符串和数组不在求和范围之内.但如果是10php这中字符串,就按10去计算
echo array_sum($arr1) . '<hr>';
//求所有数的成绩时使用array_product
echo array_product($arr1) . '<br>';
//对应1*88*88*10*1*88
上述运行结果:
3、栈操作
<?php
namespace _0811;
//栈操作:成员的增删,只允许在数组的一端进行
//栈操作是增删受限的操作
$arr = [1];
// 尾部添加:array_push(目标数组,要插入的数值),尾部删除:array_pop()
echo array_push($arr,10,20);
echo '<hr>';
//返回插入的数量
print_r($arr);
echo '<hr>';
//array_pop删除尾部的值并返回它
echo array_pop($arr);
echo '<hr>';
//头部添加:array_unshift() 头部删除:array_shift()头部操作
$arr1 = [1];
echo array_unshift($arr1,10,20);
print_r($arr1);
echo '<hr>';
echo array_shift($arr1);
//队列:
//1.尾部追加,头部删除
//array_push(),array_shift()
//2.头部追加,尾部删除
//array_unshift(),array_pop()
上述运行结果:
4、数组的排序
<?php
namespace _0811;
//数组的排序
$arr = [30,4,82,15,20,'abc','hello',2,46];
printf('<pre>%s</pre>',print_r($arr,true));
//默认排序:升序(键名自动重置)sort()
sort($arr);
printf('<pre>%s</pre>',print_r($arr,true));
//默认排序:升序(键名不重置)
$arr = [39,41,8,5,22,'cde','world',2,46];
asort($arr);
printf('<pre>%s</pre>',print_r($arr,true));
//降序:(键名自动重置)rsort($arr)
rsort($arr);
printf('<pre>%s</pre>',print_r($arr,true));
$arr = [30,4,82,15,20,'abc','hello',2,46];
//降序:(键名不自动重置)arsort($arr)
arsort($arr);
printf('<pre>%s</pre>',print_r($arr,true));
//2.键排序
//ksort($arr):按键升序
ksort($arr);
printf('<pre>%s</pre>',print_r($arr,true));
//krsort($arr):按键降序
krsort($arr);
printf('<pre>%s</pre>',print_r($arr,true));
//自定义排序
$arr1 = [90,33,2,184,24,39];
printf('<pre>%s</pre>',print_r($arr1,true));
echo '<hr>';
usort($arr1,function($a,$b){
//升序 第一次90 33进行比较,小于0就交换
return $a-$b;
});
printf('<pre>%s</pre>',print_r($arr1,true));
echo '<hr>';
usort($arr1,function($a,$b){
//降序
return $b-$a;
});
printf('<pre>%s</pre>',print_r($arr1,true));
echo '<hr>';
//打乱数组,每次刷新都不一样
shuffle($arr1);
printf('<pre>%s</pre>',print_r($arr1,true));
/**
* 1.值排序
* 默认排序:升序
* sort($arr)
* 保持键名
* asort($arr)
* 降序
* rsort($arr)
* 保持键名
* arsort($arr)
*/
/**
* 2.键排序
* 按键名升序
* ksort($arr)
* 按键名降序
* krsort($arr)
*/
/**
* 3.自定义排序
*usort(数组,自定义函数)
*/
/**
* 4.打乱函数
* shuffle(数组)
* 打乱数组里的数,每次都不一样
*/
上述运行结果:
5、查询与替换
<?php
namespace _0811;
//查询与替换
//array_slice() 取出一部分成员
//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,-4,3);
printf('<pre>%s</pre>',print_r($res,true));
echo '<hr>';
//array_splice():增删改
$arr1 = [10,28,9,33,56,21,82,47];
printf('原始数组元素:<pre>%s</pre>',print_r($arr1,true));
echo '<hr>';
//默认功能:删除
//返回值是被删除的元素
$res1=array_splice($arr1,1,2);
printf('<pre>%s</pre>',print_r($res1,true));
echo '<hr>';
//查看原数组
printf('查看原数组<pre>%s</pre>',print_r($arr1,true));
//替换
$res2 = array_splice($arr1,1,2,[666,999]);
printf('被删除的元素<pre>%s</pre>',print_r($res2,true));
echo '<hr>';
//查看原数组
printf('查看原数组<pre>%s</pre>',print_r($arr1,true));
echo '<hr>';
//增加
$res3 = array_splice($arr1,1,0,[666,999]);
printf('被删除的元素<pre>%s</pre>',print_r($res3,true));
echo '<hr>';
//查看原数组
printf('查看原数组<pre>%s</pre>',print_r($arr1,true));
echo '<hr>';
上述运行结果:
6、数组API
<?php
namespace _0811;
//
$arr = [
150,
'php',
true,
[4,5,6],
(new class(){
}),
[],
null,
false,
'',
0,
'0'
];
//array_filter(),只返回数组中为true的元素组成的数组
$res = array_filter($arr);
printf('<pre>%s</pre>',print_r($res,true));
//空对象不能转为false,但是空数组是false
//php自动转为false的值,null,false,空数组,空字符串,0,'0'
$res = array_filter($arr,function($item){
//只返回基本数据类型
return is_scalar($item);
});
printf('<pre>%s</pre>',print_r($res,true));
//再次把空过滤掉(嵌套过滤)
printf('<pre>%s</pre>',print_r(array_filter($res),true));
echo '<hr>';
//array_map()对每个成员,做回调处理,返回新数组
$arr1 = [
'php',
[3,4,5],
(new class(){
public string $name = '电脑';
public int $price = 8888;
}),
15,
20
];
//拉平
//get_object_var($object),返回一个数组。获取$object对象中的属性,组成一个数组
$res = array_map(function($item){
switch(gettype($item)){
case 'array':
$item = implode(',',$item);
break;
case 'object':
$item = implode(',',get_object_vars($item));
break;
}
return $item;
},$arr1);
printf('<pre>%s</pre>',print_r(array_filter($res),true));
echo '<hr>';
//array_reduce(要处理的数组,回调函数(累加结果,当前值),初值):迭代/归并处理函数
$arr = [1,2,3,4,5,6];
echo array_sum($arr) . '<hr>';
$res = array_reduce($arr,function($acc,$cur){
echo $acc . ',' . $cur . '<hr>';
return $acc + $cur;
},10);
echo $res;
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');
上述运行结果: