一、 数组API
1. 遍历
直接遍历
<?php
namespace _0811;
$stu = ['id' => 1, 'name' => 'Jack', 'course' => 'php', 'score' => 90];
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));
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));
prev($stu);
printf('[%s]=>%s.<br>',key($stu), current($stu));
prev($stu);
printf('[%s]=>%s.<br>',key($stu), current($stu));
// 指针重置回数组第一个
reset($stu);
printf('[%s]=>%s.<br>',key($stu), current($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>';
//$key=key(),$value=current()
foreach($stu as $key=>$value ){
printf('[%s]=>%s.<br>', $key, $value);
}
解构遍历
echo '<hr>';
// 解构
// 索引数组解构
list($name, $price) = ['手机', 5000];
echo $name.':'.$price.'<br>';
// 关联数组解构,在 PHP 7.1.0 之前的版本,list() 仅能用于数字索引的数组,并假定数字索引从 0 开始。
list('name'=>$name, 'price'=>$price) = ['name'=>'电脑', 'price'=>9000];
echo $name.':'.$price.'<br>';
extract(['name'=>'相机', 'price'=>19000]);
echo $name.':'.$price.'<br>';
foreach遍历
// 用二维数组来模拟数据表查询结果
$users = [
['id'=> 5, 'name'=> 'Mike'],
['id'=> 8, 'name'=> 'John'],
['id'=> 14, 'name'=> 'Jerry'],
];
//foreach
foreach($users as $user) {
// print_r($user);
vprintf('id=>%s,name=>%s.<br>', $user);
}
echo '<hr>';
//foreach + list,更优雅一点的语法,同时还能在其中做校验等工作。
foreach($users as list('id'=>$id, 'name'=>$name)) {
printf('id=>%s,name=>%s.<br>', $id, $name);
}
2. 值操作
array_values():将数组的值,组成一个新数组,键名会重置。
用途:数组增删改查键名混乱后重置数组。
$arr = [0=>1, 2=>88, 3=>'php', 6=>[1,2,3]];
printf('<pre>%s</pre>', print_r($arr,true));
printf('<pre>%s</pre>', print_r(array_values($arr),true));
in_array():查询某个元素是否在这个数组中,返回布尔值。
用途:白名单查询等
echo in_array('php', $arr) ? 'php在数组中' : 'php不在数组中';
array_search():类似in_array(),但返回找到的索引。
$index = array_search('php', $arr);
printf('index:%s, value:%s.<br>', $index, $arr[$index]);
array_unique():去重
$arr = [0=>1, 1=>'php', 2=>88, 3=>'php', 6=>[1,2,3]];
// printf('<pre>%s</pre>', print_r($arr,true));
// 去重
$new_arr = array_unique($arr);
print_r($new_arr);
count() 统计成员个数
echo count($arr);
array_count_values():统计每个成员的值出现的次数
$arr = [0=>1, 1=>'php', 2=>88, 3=>'php', 6=>88];
printf('<pre>%s</pre>.<br>', print_r(array_count_values($arr),true));
array_sum():求和
$arr = [0=>1, 1=>'php', 2=>88, 3=>'php', 6=>88];
// 1+0+88+0+88=177,字符串当做0值
echo array_sum($arr).'<br>';
$arr = [0=>1, 1=>'10php', 2=>88, 3=>'php', 6=>88];
// 1+10+88+0+88=187,‘10php’字符串值10
echo array_sum($arr).'<br>';
array_product():求乘积
$arr = [0=>1, 1=>'1php', 2=>88, 3=>'1php', 6=>88];
//字符串值为1,乘积值为7744
echo array_product($arr);
3. 栈操作
栈操作:成员的增删只在数组的一端进行,本质上是增删受限的操作。
// 尾部操作
$arr = [1];
// array_push返回数组长度。
echo array_push($arr,10,20).'<br>';
// 测试个写pre写法
print('<pre>');
print_r($arr);
print('</pre>');
// array_pop()返回弹出的值
echo array_pop($arr).'<br>';
printf('<pre>%s</pre>', print_r($arr, true));
// array_pop()返回弹出的值
echo array_pop($arr).'<br>';
printf('<pre>%s</pre>', print_r($arr, true));
// 头部操作
$arr = [1];
// array_unshift返回数组长度。
echo array_unshift($arr,10,20).'<br>';
printf('<pre>%s</pre>', print_r($arr, true));
// array_shift()返回移出的值
echo array_shift($arr).'<br>';
printf('<pre>%s</pre>', print_r($arr, true));
// array_shift()返回移出的值
echo array_shift($arr).'<br>';
printf('<pre>%s</pre>', print_r($arr, true));
队列操作
// 尾部追加,头部删除。
$arr = [1];
//字符串都是布尔值的true
// echo boolval('false') ? 'true' : 'false';
//放个假布尔值,实际是字符串
array_push($arr, 'false');
printf('<pre>%s</pre>', print_r($arr, true));
array_shift($arr);
printf('<pre>%s</pre>', print_r($arr, true));
//头部追加,尾部删除。
echo '<hr>';
array_unshift($arr,1);
printf('<pre>%s</pre>', print_r($arr,true));
array_pop($arr);
printf('<pre>%s</pre>', print_r($arr,true));
4. 排序
4.1 值排序
$arr = [0, '0', '1', '!', '?', -1, 1, 30, 4, 82, 15, 20, 'A', 'abc', 'hello', 2, 46];
printf('<pre>%s</pre>', print_r($arr,true));
// 默认升序,0值之后先排字符串后排数字,键都会重置。
sort($arr);
printf('<pre>%s</pre>', print_r($arr,true));
// 键名不重置
asort($arr);
printf('<pre>%s</pre>', print_r($arr,true));
// 降序 rsort()
// 键名不重置
arsort($arr);
printf('<pre>%s</pre>', print_r($arr,true));
4.2 键排序
键排序默认升序,排序后与原数组无差别。
ksort($arr);
printf('<pre>%s</pre>', print_r($arr,true));
键名降序排序
krsort($arr);
printf('<pre>%s</pre>', print_r($arr,true));
自定义排序
$arr = [90, 33, 2, 184, 24, 3];
printf('<pre>%s</pre>', print_r($arr,true));
usort($arr, function($a, $b){
//升序
return $a - $b;
// 降序
// return $b - $a;
});
printf('<pre>%s</pre>', print_r($arr,true));
每次调用随机乱序
shuffle($arr);
printf('<pre>%s</pre>', print_r($arr,true));
第一次刷新
第二次刷新
5. 查询替换
slice切片
$stu = ['id' => 101, 'name' => '无忌', 'age' => 20, 'course' => 'php', 'grade' => 80];
$res = array_slice($stu, 2, 2);
printf('<pre>%s</pre>', print_r($res,true));
删除
$arr = [10, 28, 9, 33, 56, 21, 82, 47];
printf('原数组:<pre>%s</pre>', print_r($arr,true));
$res = array_splice($arr, 1, 2);
printf('删除:<pre>%s</pre>', print_r($res,true));
printf('效果:<pre>%s</pre>', print_r($arr,true));
替换
//最后替换内容参数可以是单值也可以是数组。
$res = array_splice($arr, 1, 2, [666, 999]);
printf('被替换:<pre>%s</pre>', print_r($res,true));
printf('替换后:<pre>%s</pre>', print_r($arr,true));
追加
//从索引1处删除0个,增加两个元素。
$res = array_splice($arr, 1, 0, [666, 999]);
printf('没有被删除的:<pre>%s</pre>', print_r($res,true));
printf('效果:<pre>%s</pre>', print_r($arr,true));
6. 回调
6.1 array_filter()过滤
$arr = [
150,
'php',
true,
[4, 5, 6],
(new class(){
}),
[],
null,
false,
'',
0,
'0',
];
printf('原数组:<pre>%s</pre>', print_r($arr,true));
//array_filter(),默认过滤数组中为true的元素,返回新数组。
$res = array_filter($arr);
printf('处理后:<pre>%s</pre>', print_r($res,true));
采用回调方式效果一样
$res = array_filter($arr, function ($item) {
return $item;
});
回调可以改变默认过滤方式,例如只返回标量/基础数据类型。
$res = array_filter($arr, function ($item) {
// return $item;
// 只返回标量/基础数据类型
return is_scalar($item);
});
// 再次过滤,仍是默认过滤掉空元素(非true)。
printf('处理后:<pre>%s</pre>', print_r(array_filter($res),true));
6.2 array_map()
对每个成员做回调处理,返回新数组。
$arr = [
'php',
[4, 5, 6],
(new class(){
public string $name = '电脑';
public int $price = 8888;
}),
15,
20,
];
printf('原数组:<pre>%s</pre>', print_r($arr,true));
//拉平,将数组成员扁平化
$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;
}, $arr);
printf('处理后:<pre>%s</pre>', print_r($res,true));
6.3 array_reduce()
迭代简化
$arr = [1, 2, 3, 4, 5, 6];
// array_sum()的底层也是array_reduce()
echo 'sum求和结果:'.array_sum($arr).'<br>';
// array_reduce()参数1是需要简化的数组,参数2回调,参数3是从哪个值开始迭代简化。
$res = array_reduce($arr, function ($acc, $cur) {
echo '每轮参与计算的acc和cur:'.$acc.','.$cur.'<br>';
return $acc + $cur;
}, 0);
echo 'reduce求和结果:'.$res;
6.4 array_walk()
使用自定义函数进行回调,返回布尔值。不常用,可以用array_map代替。
$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);
}, 'red');