数组统计
<?php
//count统计数组成员数量(count不单可以统计数组,还可以统计很多东西)
$arr=[1,2,3,4,5,6,7,8,9,1,1];
echo count($arr);
// for($i=0;$i<=count($arr);$i++){
// echo ($i+1),'<br>';
// }
echo '<hr>';
//array_count_values — 统计数组中所有的值出现的次数(听其名知其意‘数组_统计_值’)
printf('<pre>%s</pre>',print_r(array_count_values($arr),true));
//结果为1值=3次
//如果需要进行数组计算,下面出现两个字符串,php7将解析为0.
$arr=[1,2,3,'php7','7php',5,8];
//array_sum为数组相加求和
//array_product为数组相乘求积
echo array_sum($arr).'===='.array_product($arr);
栈与队列
<?php
// 栈与队列
// 栈: 后进先出, 最后进入的最先出来, LIFO, 添加与删除受限,只允许在一端进行
// 队列: 先进先出, 最先插入的数据最先出来, FIFO, 添加与删除允许在二端进行
//1,栈:尾部添加/删除
$i='php';
$v=[66,55,33];
$stack=['name','email'];
//array_push — 将一个或多个单元压入数组的末尾(入栈)
array_push($stack,$i,$v);//后添加后打印
printf('<pre>%s</pre>',print_r($stack,true));
//array_pop返回出栈的元素
//array_pop — 将数组最后一个单元弹出(出栈)
//简单的说就是把最后条添加的数组给删掉。
array_pop($stack);
//结果是$v不会被打印出来
printf('<pre>%s</pre>',print_r($stack,true));
echo '<hr>';
//2,栈:头部删除/修改
//array_unshift — 在数组开头插入一个或多个单元
//原理同上,只是位置发生了变化。
array_unshift($stack,$i,$v);//后添加先打印
printf('<pre>%s</pre>',print_r($stack,true));
//返回元素array_shift(同上返回一样)
array_shift($stack);
printf('<pre>%s<pre>',print_r($stack,true));
echo '<hr>';
//队列操作(就是栈操作的结合)
//尾进+头出(array_push + array_shift)
//这里需要注意的是:添加的东西按顺序排列
$i='name';
$v='NET2.0';
$queue=['php',100];
array_push($queue,$i,$v);
//需要输出则是一个一个echo输出
echo array_shift($queue);
//printf('<pre>%s</pre>',print_r($queue,true));
echo '<br>';
//头进 + 尾出 (array_pop + array_unshift)原理同上。只是换了位置
array_unshift($queue,$i,$v);
echo array_pop($queue);
排序
<?php
//排序
$arr=[10,20,'PHP','100','百度',10=>'html',30,'7php','7html','NET2'];
//先打印原看看他的数组
printf('<pre>%s</pre>',print_r($arr,true));
//开始:
//1,升序(说明:从小排到大。如果出现字符串和数字同时出现,会先排字符串,原因是字符串解析成数字是0.同时重置“键”的值)
//sort — 对数组排序(重置索引)
sort($arr);
printf('<pre>%s</pre>',print_r($arr,true));
$arr=[10,20,'PHP','100','百度',10=>'html',30,'7php','7html','NET2'];
//asort();(索引不变)!a=asoc
asort($arr);
printf('<pre>%s</pre>',print_r($arr,true));
echo '<hr>';
//2,降序(原理同上取反)
rsort($arr);//重置索引
arsort($arr);//索引不变
echo '<p>键名排序</p>';
//键名排序
$arr=[7=>10,20,'PHP','100','百度',10=>'html',30,'7php','7html',3=>'NET2'];
//ksort — 对数组按照键名排序(键名升序)
ksort($arr);
printf('<pre>%s</pre>',print_r($arr,true));
//krsort 降序
krsort($arr);
printf('<pre>%s</pre>',print_r($arr,true));
echo '<p>自定义值升序排序</p>';
//usort — 使用用户自定义的比较函数对数组中的值进行排序
$arr=[10,2,0,50,100,1.2];
usort($arr,function($a,$b){
//$a-$b表示,需要在数组中的“值”两个两个取出来进行运算。如果遇到非数字,则报错。
//注意:运算符是“-”
return $a-$b;
});
printf('<pre>%s</pre>',print_r($arr,true));
echo '<p>自定义值降序</p>';
//自定义降序只需要把取出来的两个值对调过来运算即可。
usort($arr,function($a,$b){
return $b-$a;
});
printf('<pre>%s</pre>',print_r($arr,true));
echo '<hr>';
echo '<p>自然升序排序</p>';
$arr=[10,2,0,'img31.png',50,'img22.png',100,1.2];
natsort($arr);
//也是由数组的值进行排序的(索引不变)
var_dump($arr);//打印结果
printf('<pre>%s</pre>',print_r($arr,true));
echo '<p>乱序(随机排序)</p>';
//shuffle — 将数组打乱
//索引重置,值随机排序
shuffle($arr);
printf('<pre>%s</pre>',print_r($arr,true));
echo '<hr>';
echo '<p>键和值交换排序</p>';
//array_flip — 交换数组中的键和值
//注意:array_flip():只能翻转字符串和整数值!
$arr=[10=>1,30=>2,'name'=>'admin','email'=>'123qq.com'];//这样做是有问题的。因为类型没有统一
// $arr=['name'=>'user','email'=>'123qq.com'];//没问题
// $arr=['id'=>'y','total'=>'e'];
//注意下面应该是$arr=@array_flip()而不是跟上面那样直接写了。
$arr=@array_flip($arr);
printf('<pre>%s</pre>',print_r($arr,true));
数组查询与替换
<?php
//数组查询与替换
//array_slice — 从数组中取出一段
//支持正数和负数。正数就是从左到右,负数就从右到左
$arr=['id'=>10,'account'=>'admin','name'=>'管理员','password'=>'123456','qq'=>'123456','tel'=>'10010'];
$res=array_slice($arr,0,2);
//(1,-1)表示,从索引1开始取,去除右边的-1个索引的数值
$res1=array_slice($arr,1,-1);
//(-3,3)表示:从右边-3的索引开始取数组,取3位。
$res2=array_slice($arr,-3,3);
//echo $res,$res1;
$arr1=print_r($res,true);
$arr2=print_r($res1,true);
$arr3=print_r($res2,true);
//删除,替换,添加数组成员array_splice()同样支持负数
//删除
$delete=array_splice($arr,-2,1);
$delete1=print_r($delete,true);//输出被删除元素。
//$delete1=print_r($arr,true);//除了别删除元素,其他输出
//删除替换。。可以删除多个只替换一个。也是可以的
$replace=array_splice($arr,1,3,['super','超级管理员']);
$replace1=print_r($arr,true);
//添加($arr,索引位置,0:表示,不删除。['xx'=>xx]:表示从索引几的位置开始添加需要数据
$add=array_splice($arr,-2,0,['email'=>'123qq.com']);
$add1=print_r($arr,true);
printf('<pre>%s%s%s<p>删除,替换,添加数组</p>%s%s%s</pre>',$arr1,$arr2,$arr3,$delete1,$replace1,$add1);
echo '<hr>';
数组元素回调处理
<?php
//数组元素回调处理(注意不能留空:就是不能有空格键,否则报错)
$arr=[10,'id'=>20,false,null,(new class{}),0,'','0',true];
//array_filter — 用回调函数过滤数组中的单元
//表示:过滤掉空数组,留下有值的数组
//php自动转为false的值: null, false, 空数组, 空字符串, 0, '0'
//可以这样写:
//$res=array_filter($arr,function($item){
// return $item;
// });
//这样简写:
$res=array_filter($arr);
//echo $res;
$res1=print_r($res,true);
//如果需要返回标量:
//is_scalar — 检测变量是否是一个标量
//标量:单值变量。数组和对象都不是单值变量
$scalar=array_filter($arr,function($item){
return is_scalar($item);
});
$scalar1=print_r($scalar,true);
printf('<pre>%s<p>返回标量</p>%s</pre>',$res1,$scalar1);
echo '<hr>';
$arr=['name',20,[1,2,3],(new class{public $Bname='小米';public $Price=3000;}),'purch'=>'立即购买'];
////array_map — 将回调函数作用到给定数组的单元上
$res=array_map(function($item){
//拉平数组$item接受数据。gettype获取变量类型
switch(gettype($item)){
//get_object_vars — 返回由对象属性组成的关联数组
case 'object':
$item=get_object_vars($item);
//implode — 将一个一维数组的值转化为字符串
case 'array':
$item=implode($item);
}
return $item;
},$arr);
printf('<pre>%s</pre>',print_r($res,true));
echo '<hr>';
//array_map()同时处理多个数组
$key=['host','root','password','db'];
$val=['localhost','root','1231456','baidu'];
//array_combine — 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
$res =array_combine($key,$val);
//echo $res;
//$res1=print_r($res,true);
printf('<pre>%s</pre>',print_r($res,true));
echo '<hr>';
$res=array_map(function($val1,$val2){
return [$val1=>$val2];
},$key,$val);
printf('<pre>%s</pre>',print_r($res,true));
echo $res[2]['password'];
echo '<hr>';
//array_reduce — 用回调函数迭代地将数组简化为单一的值
$res=array_reduce($res,function($prev,$current){
//获取当前元素“键”
$key=key($current);
//获取“值”
$val=current($current);
//键和值拼装
$prev[$key]=$val;
return $prev;
});
printf('<pre>%s</pre>',print_r($res,true));
总结:上面的函数回调还能免强有点感觉,迭代这里完全搞不懂,一点都没看懂。