数组的种类与定义与访问方式
//数组分类:索引数组、关联数组、多维数组
//1、索引数组:带有数字索引的数组
$goods=[0=>'1001',1=>'小米手机',2=>'3000元',3=>'有货'];
$goods=['1001','小米手机','3000元','有货'];//数组默认从0开始编号,递增为1
$goods=[5=>'1001',1=>'小米手机',8=>'3000元',9=>'有货'];
$goods=[6=>'1001','小米手机','3000元',3=>'有货'];//键值分别为6、7、8、3
printf('<pre>%s</pre>',print_r($goods,true));
echo $goods[6],'<br>';//调取键值对应的值:6=>1001
echo $goods[3],'<hr>';
//追加式创建索引数组,使用默认的键名:默认从0开始,逐渐递增1
$goods=[];
$goods[]='1002';
$goods[]='小米电脑';
$goods[]='5000元';
$goods[]='有货';
printf('<pre>%s</pre>',print_r($goods,true));
echo '<hr>';
//2、关联数组:带有指定键的数组
$goods=['id'=>'1001','name'=>'小米手机','price'=>'3000元','is'=>'有货'];
printf('<pre>%s</pre>',print_r($goods,true));
echo $goods['name'],',',$goods['price'],'<hr>';
//追加式创建关联数组,使用语义化的字符串键名
$goods=[];
$goods['id']='1002';
$goods['name']='小米电脑';
$goods['price']='5000元';
$goods['is']='有货';
printf('<pre>%s</pre>',print_r($goods,true));
echo '<hr>';
//3、多维数组:包含一个或多个数组的数组
//多维数组常用的是二维数组;=> 胖箭头, -> 小箭头
$goods=[
['id'=>'1001','name'=>'小米手机','price'=>'3000元','is'=>'有货'],
['id'=>'1002','name'=>'华为手机','price'=>'4500元','is'=>'有货'],
['id'=>'1003','name'=>'苹果手机','price'=>'6000元','is'=>'无货'],
];
printf('<pre>%s</pre>',print_r($goods,true));
//多维数组调取数据,苹果手机对应一维中的键名为2,对应二维中的键名为name
echo $goods[2]['name'],'<br>';
echo '类别:'.$goods[0]['name'].',价格:'.$goods[0]['price'],'<br>';
echo '类别:'.$goods[1]['name'].',价格:'.$goods[1]['price'],'<hr>';
数组的遍历
//数组遍历:逐个遍历、while遍历、for循环遍历、foreach遍历
//定义数组
$goods=[
'id'=>'1001',
'name'=>'小米手机',
'price'=>'3000元',
'is'=>'有货'
];
//1、逐个遍历:输出当前指针指向的数组元素的键名和值
//current():值;key():键名
printf('[\'%s\']=>%s<br>',key($goods),current($goods));
//next() 函数将内部指针指向数组中的下一个元素,并输出
next($goods);
printf('[\'%s\']=>%s<br>',key($goods),current($goods));
// prev() - 将内部指针指向数组中的上一个元素,并输出
prev($goods);
printf('[\'%s\']=>%s<br>',key($goods),current($goods));
// end() - 将内部指针指向数组中的最后一个元素,并输出
end($goods);
printf('[\'%s\']=>%s<br>',key($goods),current($goods));
//current() - 返回数组中的当前元素的值
current($goods);
printf('[\'%s\']=>%s<br>',key($goods),current($goods));
// reset() - 复位,将内部指针指向数组中的第一个元素,并输出
reset($goods);
printf('[\'%s\']=>%s<br>',key($goods),current($goods));
echo '<hr>';
//2、while(条件):只要指定的条件成立,则循环执行代码块
while(true){
printf('[\'%s\']=>%s<br>',key($goods),current($goods));
if(next($goods)) continue;
else break;
}
echo '<hr>';
//3、for循环遍历:for(初始值;条件;增量){要执行的代码;}
//for循环只能用于遍历纯索引数组
echo count($goods).'<br>';//count():数组中元素的数目
reset($goods);
for($i=0;$i<count($goods);$i++){
printf('[\'%s\']=>%s<br>',key($goods),current($goods));
next($goods);
}
echo '<hr>';
//for遍历中的复位数组指针和数组下移指针操作必须手动填写,foreach()遍历方法可以省略此步骤
//4、foreach循环遍历;foreach($array as $value){要执行的代码;};每进行一次循环,当前数组元素的值就会被赋值给 $value 变量(数组指针会逐一地移动),在进行下一次循环时,您将看到数组中的下一个值
//foreach可以遍历任何类型的数组;$array表示要循环的数组
foreach($goods as $value){//只显示键名对应的值
echo $value.'<br>';
}
echo '<hr>';
foreach($goods as $key=>$value){//可以显示键名和对应的值
printf('[\'%s\']=>%s<br>',$key,$value);
}
echo '<hr>';
//list()用于在一次操作中给一组变量赋值;只用于数字索引的数组
list($a,$b)=['admin',20];
echo $a.',年龄:'.$b.'<br>';
//当list()用于关联数组时,必须填写键名
list('name'=>$a,'age'=>$b,'sex'=>$c)=['name'=>'a1','age'=>25,'sex'=>'女'];
echo '姓名:'.$a.',年龄:'.$b.',性别:'.$c.'<hr>';
$user=[
['name'=>'a5','age'=>23,'sex'=>'女'],
['name'=>'a2','age'=>30,'sex'=>'男'],
['name'=>'a3','age'=>40,'sex'=>'女'],
];
foreach($user as list('name'=>$a,'age'=>$b,'sex'=>$c)){
printf('name=%s,age=%d,sex=%s<br>',$a,$b,$c);
}
echo '<hr>';
//foreach()既可以遍历数组,也可以遍历对象
$obj = new stdClass;
$obj->name = 'admin';
$obj->email = 'admin@php.cn';
$obj->role = 1;
var_dump($obj);
echo '<hr>';
foreach ($obj as $p => $v) {
echo "$p => $v <br>";
}
数组函数
//数组函数
//1、键名函数
$goods=['id'=>'1001','name'=>'小米手机','price'=>'3000元','is'=>'有货'];
echo key($goods).'<br>';//获取键名;返回数组内部指针当前指向元素的键名
next($goods);
echo key($goods).'<hr>';
//想要将数组内的所有键名打印出来
$keys=[];
while($key=key($goods)){
$keys[]=$key;
next($goods);
}
print_r($keys);
echo '<hr>';
reset($goods);//复位
//取到所有的键名,还可以自定义函数获取
function array_keys_1($goods){
$keys=[];
while($key=key($goods)){
$keys[]=$key;
next($goods);
}
return $keys;
}
// array_keys($arr): 直接返回键名组成的数组;
print_r(array_keys_1($goods));//获取到所有的键名并组成新的数组
echo '<br>';
//array_key_exists() 判断数组中是否存在指定的键名,如果键名存在则返回 true,如果键名不存在则返回 false
//array_key_exists(key,array):key必需。规定键名;array必需。规定数组
echo array_key_exists('name',$goods)?'存在':'不存在';
echo '<br>';
echo array_key_exists('hello',$goods)?'存在':'不存在';
echo '<br>';
//PHP 7 >= 7.3
echo array_key_first($goods);
echo '<br>';
echo array_key_last($goods);
echo '<hr>';
// 2、和值相关的函数
$arr = [3 => 10, 9 => 20, 0 => 'html', 'id' => 'css', 20 => 20, 30];
printf('<pre>%s</pre>',print_r($arr,true));
//只获取值
$values=[];
foreach($arr as $value){
$values[]=$value;
}
printf('<pre>%s</pre>',print_r($values,true));
//array_values():返回数组中所有的值(不保留键名)
print_r(array_values($arr));
echo '<hr>';
//in_array() 函数搜索数组中是否存在指定的值
$a=['ab','html','css','php'];
echo in_array('ab',$a) ?'找到':'未找到';
echo '<br>';
echo in_array('ho',$a)?'找到':'未找到';
echo '<hr>';
// array_search() 函数在数组中搜索某个键值,并返回对应的键名
// array_search(value,array,strict):value必需。规定在数组中搜索的值;array必需。规定被搜索的数组;
// strict可选。如果该参数被设置为 TRUE,则函数在数组中搜索数据类型和值都一致的元素;数字 5 和字符串 5 是不同的。false - 默认
$b=["a"=>"5","b"=>5,"c"=>"45"];
echo array_search('css',$a,true);//找到css这个值对应的键名2
echo '<br>';
echo array_search('5',$b);//如果在数组中找到键值超过一次,则返回第一次找到的键值所匹配的键名
echo '<hr>';
//array_unique()去重
print_r(array_unique($arr));//去掉重复的值20
$c=["a"=>"red","b"=>"green","c"=>"red"];
echo '<br>';
print_r(array_unique($c));
echo '<hr>';
//array_sum() 函数返回数组中所有值的和
$arr = [10,20,30,55,99];
echo array_sum($arr);
echo '<hr>';
//3、增加或删除数组中的元素
// 栈与队列。 栈: 是仅允许在一端进行增删的数组,先进的后出
$stack=[];
// 1)在尾部进行增加删除
//array_push() 函数向数组尾部插入一个或多个元素
array_push($stack, 10);
array_push($stack, 20);
array_push($stack, 30, 40);
//array_pop() 函数删除数组中的最后一个元素
// 在尾部出栈, 每次只允许出来一个
echo array_pop($stack);
printf('<pre>%s</pre>',print_r($stack,true));
echo '<hr>';
// 2)在头部进行增加删除
$arr=[];
//array_unshift() 函数用于向数组插入新元素。新数组的值将被插入到数组的开头;最后进入的元素排在最前面
array_unshift($arr, 'html', 'css', 'js');
array_unshift($arr, 'abc', 'ef');
//array_shift() 函数用于删除数组中的第一个元素,并返回被删除的元素
echo array_shift($arr);
printf('<pre>%s</pre>',print_r($arr,true));
echo '<hr>';
//队列: 允许在两头进行增删,先进的先出
$queue = [];
// 尾部进队 + 头部出队:array_push()+array_shift()
array_push($queue, 10,20,30);
echo array_shift($queue);
printf('<pre>%s</pre>',print_r($queue,true));
echo '<hr>';
// 头部进队 + 尾部出队:array_unshift()+array_pop()
$ef=[];
array_unshift($ef, 10,20,33);
echo array_pop($ef);
printf('<pre>%s</pre>',print_r($ef,true));
echo '<hr>';
//4、数组的排序
//1)sort() - 对数组进行升序排列;字母始终在数字前面,然后再按照字母升序排序
$item = [30, 4, 82, 15, 20, 'abc', 'hello', 2, 46];
printf('<pre>%s</pre>',print_r($item,true));
sort($item);//函数的操作会影响原始的数组,原始数组中0=>30,sort()操作后0=>abc
printf('<pre>%s</pre>',print_r($item,true));
//2)rsort() - 对数组进行降序排列
rsort($item);
printf('<pre>%s</pre>',print_r($item,true));
echo '<hr>';
//3)-6)的函数的键值对应关系均会保留
// 3)asort() - 根据数组的值,对数组进行升序排列
$a=['e' => 10, 'a' => 3, 'p' => 5,'b'=>66];
printf('<pre>%s</pre>',print_r($a,true));
asort($a);
printf('<pre>%s</pre>',print_r($a,true));
//4)arsort() - 根据数组的值,对数组进行降序排列
arsort($a);
printf('<pre>%s</pre>',print_r($a,true));
//5)ksort() - 根据数组的键,对数组进行升序排列
ksort($a);
printf('<pre>%s</pre>',print_r($a,true));
//6)krsort() - 根据数组的键,对数组进行降序排列
krsort($a);
printf('<pre>%s</pre>',print_r($a,true));
echo '<hr>';
// 7)usort() 使用用户自定义的比较函数对数组进行排序
$arr=[4,2,8,6];
usort($arr,function($a,$b){
// return $a-$b;//由小到大进行排序
return $b-$a;//由大到小进行排序
});
printf('<pre>%s</pre>',print_r($arr,true));
//8)natsort() 函数用"自然排序"算法对数组进行排序。保留它们原始的键值对应关系
$arr = ['img1.jpg', 'img5.jpg', 'img10.jpg', 'img8.jpg'];
printf('<pre>%s</pre>',print_r($arr,true));
natsort($arr);
printf('<pre>%s</pre>',print_r($arr,true));
echo '<hr>';
//5、array_slice(): 从数组中取出一部分元素
//array_slice(array,start,length,preserve):array必需。要进行操作的数组;
// start必需。数值。规定取出元素的开始位置。 0 = 第一个元素。 如果该值设置为正数,则从前往后开始取。如果该值设置为负数,则从后向前取,-2表示从数组的倒数第二个元素开始;
// length可选。规定被返回数组的长度;默认从开始位置到结尾;果该值设置为负数,则函数将在距离数组末端这么远的地方终止取出
//preserve可选。规定函数是保留键名还是重置键名;true - 保留键名;false - 默认。重置键名
$arr=['red','green','blue','yellow','brown'];
printf('<pre>%s</pre>',print_r($arr,true));
$item=array_slice($arr,1);//从数组的第2个键开始调取
printf('<pre>%s</pre>',print_r($item,true));
$item=array_slice($arr,-1);//从数组的倒数第1个键开始调取
printf('<pre>%s</pre>',print_r($item,true));
$item=array_slice($arr,1,-1);//在距离结尾1个元素的时候终止获取
printf('<pre>%s</pre>',print_r($item,true));
$item=array_slice($arr,1,2,true);//获取的时候保留原始键值对应关系
printf('<pre>%s</pre>',print_r($item,true));
echo '<hr>';
//6、array_splice() 函数从数组中删除选定的元素,并用新元素取代它。函数也将返回被移除元素的数组
//array_splice(array,start,length,arrays):array必需。规定数组;start必需。规定删除元素的开始位置。 0 = 第一个元素。如果该值设置为负数,则从数组末端倒数该值指定的偏移量开始删除。 -2 表示从数组的倒数第二个元素开始
// length可选。规定被删除的元素个数;如果该值设置为负数,则删除从 start 到数组末端倒数 length 为止中间所有的元素。如果该值未设置,则删除从 start 参数设置的位置开始直到数组末端的所有元素
// arrays可选。规定带有要插入原始数组中元素的数组
$arr = [10, 28, 9, 33, 56, 21, 82, 47];
printf('<pre>%s</pre>',print_r($arr,true));
// $res = array_splice($arr, 1, 3);//从数组的第2个键开始删除,共删除3个
// // 返回值就是被删除的元素组成的数组
// printf('<pre>%s</pre>',print_r($res,true));
// $res = array_splice($arr, -4, 3);//从数组的倒数第4个元素开始删除,共删除3个
// printf('<pre>%s</pre>',print_r($res,true));
$res = array_splice($arr, 1,-3);//从数组的第2个元素到倒数第3个元素之间的所有元素
printf('<pre>%s</pre>',print_r($res,true));
echo '<hr>';
//替换、增加
$arr=[4,2,8,6,20,40];
printf('<pre>%s</pre>',print_r($arr,true));
$res=array_splice($arr,1,2,[22,33]);//将数据第2个到第3个之间的元素替换成22,33
printf('<pre>%s</pre>',print_r($arr,true));
$res=array_splice($arr,1,0,[12,53]);//将[12,53]增加到原始数组中的第2个元素位置后面
printf('<pre>%s</pre>',print_r($arr,true));
echo '<hr>';
//7、array_filter(): 过滤数组中的元素,只返回计算结果为"true"的元素组成的数组
// 以下六种类型的数据会自动转为false
var_dump(boolval([]));
var_dump(boolval(null));
var_dump(boolval(0));
var_dump(boolval('0'));
var_dump(boolval(''));
var_dump(false);
//php 里的标量就是 int , string , bool , float 这几种类型
$a1=['a','b',2,3,4,(new class {}),[23,44],[],null,0];
$a2=array_filter($a1,function ($item){
return $item;//return boolval($item)的简写
});
printf('<pre>%s</pre>',print_r($a1,true));
printf('<pre>%s</pre>',print_r($a2,true));
// 如果只是简单的过滤掉false值,可以不写回调函数,简写成$a2 = array_filter($a1);
// 如果对返回的为true的元素,进行再次的处理, 就必须要写回调参数
$a2 = array_filter($a1,function($item){
// return is_scalar($item) && $item;// 只返回标量: 字符串, 数值, 布尔,浮点类型
return is_object($item);// 只返回对象
// return is_array($item) && $item;// 只返回数组
});
printf('<pre>%s</pre>',print_r($a2,true));
echo '<hr>';
//8、array_map()为数组中的每一个元素应用回调函数进行处理,并返回一个新数组
$arr = ['php',[3,4,5], (new class {public $name='电脑';public $price=8888;}), 15, 20];
printf('<pre>%s</pre>',print_r($arr,true));
// 1)如果元素是对象: 就输出它的属性
// 2)如果元素是数组,就转为字符串输出
// 3)其它元素,直接输出
$res=array_map(function($item){
switch(gettype($item)) {//gettype() 获取变量的类型
case 'object':
$item = implode(',', get_object_vars($item));//get_object_vars()返回由对象属性组成的关联数组
break;
case 'array':
$item = implode(',', $item);//implode() 把数组元素组合成一个字符串
break;
}
return $item;
}, $arr);
printf('<pre>%s</pre>',print_r($res,true));
echo '<hr>';
//9、array_reduce(): 元素迭代处理形成单一的返回值;发送数组中的值到用户自定义函数,并返回一个字符串
//array_reduce(array,function,initial):array必需。规定数组;function必需。规定函数的名称;initial可选。规定发送到函数处理的第一个值
$arr = [1,2,3,4,5];
$res = array_reduce($arr, function($prev, $next){
//求和,当前的运算结果,实际上通过$prev返回
return $prev += $next;
});
print_r($res);
echo '<br>';
function my($v1,$v2)
{
return $v1 . "-" . $v2;
};
$a=array("Dog","Cat","Horse");
print_r(array_reduce($a,"my",5));
echo '<br>';
$arr = [1,2,3,4,5];
$res = array_reduce($arr, function($prev, $next){
//求和,当前的运算结果,实际上通过$prev返回
return $prev += $next;
},7);//7+1+2+3+4+5
print_r($res);
echo '<hr>';
//10、implode() 把数组元素组合成一个字符串
//implode(separator,array):separator可选。规定数组元素之间放置的内容,默认是 ""(空字符串);array必需。要组合为字符串的数组
$arr = [1,2,3,4,5];
$res=implode('-',$arr);
printf('<pre>%s</pre>',print_r($res,true));
//explode() 分割字符串;使用一个字符串分割另一个字符串,并返回由字符串组成的数组
$str = "www.php.com";
$abc=explode('.',$str);//在.处进行分割
printf('<pre>%s</pre>',print_r($abc,true));
echo '<hr>';
//11、extract()将关联数组的键值对转为一个个独立的变量, 变量名就是原来的键名
//extract(array,extract_rules,prefix):array必需。规定要使用的数组
// extract_rules可选。extract() 函数将检查每个键名是否为合法的变量名,同时也检查和符号表中已存在的变量名是否冲突;prefix可选
$config = [
'type' => 'mysql',
'host' => 'localhost',
'dbname' => 'php',
'charset' => 'utf8'
];
extract($config);
echo $type.',', $host.',', $dbname.',', $charset;
echo '<hr>';