php十个常用数组函数,回调函数,与array_slice
在php中,数组函数和字符串函数,两个加起来,可以说完成了很多工作,比如数组的排序,在用c语言写的话,就要写一个函数功能块,而在php中,大大简化了这一步,
数组常用函数,PHP都已经内置好了,只管调用就行,所以,掌握好字符串函数和数组函数,就能优化你的代码
十个常用数组函数
1.array_search()搜索数组中的值
array_search(搜索值,数组,类型是否相同)
,在数组中搜索给定的值,如果成功返回相应的键名
示例:
$str = ['blue','green','red','black'];
$search = 'blue';
$key = array_search($search,$str);
echo $key;
输出:0
2.array_merge() 合并数组
array_merge(array1,arrar2,...)
,合并数组,如果是索引数组,则键名保持不变,如果是关联数组,则会重新进行设置
示例:
$array1 = ['10','id' =>'10','99'];
$array2 = ['20','id' =>'30','40'];
$array3 = ['30','id' =>'40','50'];
$result = array_merge($array1,$array2,$array3);
printf('<pre>%s</pre>',print_r($result,true));
输出:
Array
(
[0] => 10
[id] => 40
[1] => 99
[2] => 20
[3] => 40
[4] => 30
[5] => 50
)
3.key()
从关联数组中取得键名
案例:
$array = ['id' => '2','name' => '张三','class' =>'991'];
while ( $array_name = current($array)){
if ($array_name == '张三'){
echo key($array).'<br>';
}
next($array);
}
echo '<hr>';
输出:Array ( [0] => id [1] => name [2] => class )
4.array_chunk()
将一个数组分割成多个
示例
$input_array = ['name' => 'apple','price' => '12','type' =>'中国'];
printf('<pre>%s<pre>',print_r(array_chunk($input_array,2,true),true));
echo '<hr>';
输出
Array
(
[0] => Array
(
[name] => apple
[price] => 12
)
[1] => Array
(
[type] => 中国
)
)
5.array_combine()
创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
$a = ['name','id','class','school'];
$b = ['张三','10','198','女子高中'];
$c = array_combine($a,$b);
printf('<pre>%s</pre>',print_r($c,true));
echo '<hr>';
输出:
Array
(
[name] => 张三
[id] => 10
[class] => 198
[school] => 女子高中
)
6.array_diff()
arrray_diff($array1,$array2,array3),对比array1和其他一个或多个数组,返回在array1中但不在其他数组里的值
示例
$array1 = ['apple','banana','orange','jjjj'];
$array2 = ['apple','banana'];
$array3 = ['apple'];
$result = array_diff($array1,$array2,$array3);
print_r($result);
输出
Array
(
[2] => orange
[3] => jjjj
)
7.array_map()
为数组的每个元素应用回调函数
示例
// 为数组的每个元素应用回调函数
$array1 = ['1','2','3','4','5'];
$array2 = ['2','3','4','5','6'];
// 执行单个数组的回调函数
function cube($n)
{
return ($n * $n);
}
function cube1($n, $m)
{
return ($n * $m);
}
$b = array_map("cube",$array1);
// 传入两个及以上的数组时,他们元素数量将会相等。因为回调函数会并行处理相互对于的元素,如果长度不一,空元素会扩展短数组
$c = array_map('cube1',$array1,$array2);
print_r($b);
// 当回调函数为null值时,会创建一个多维数组
$d = array_map(null,$array1,$array2);
printf('<pre>%s</pre>',print_r($d,true));
echo '<hr>';
输出:
Array
(
[0] => 1
[1] => 4
[2] => 9
[3] => 16
[4] => 25
)
Array
(
[0] => Array
(
[0] => 1
[1] => 2
)
[1] => Array
(
[0] => 2
[1] => 3
)
[2] => Array
(
[0] => 3
[1] => 4
)
[3] => Array
(
[0] => 4
[1] => 5
)
[4] => Array
(
[0] => 5
[1] => 6
)
)
8.array_intersect()
计算数组的交集
array_intersect($array1, array $array2,…);
函数执行返回一个数组,该数组包含了所有在array1中同时出现在所有其他参数数组中的值,键名保持不变
示例:
$array = ['green','red','blue','pink'];
$array1 = ['green','blue'];
$array2 = ['red','blue'];
$result = array_intersect($array,$array1,$array2);
print_r($result);
echo '<hr>';
输出:
Array
(
[2] => blue
)
9.array_intersect_key()
使用键名比较数组的交集,函数返回一个数组,该数组包含了所有在array1中并同时出现在所有其他数组中的键名的值
注意只检查键名
示例:
$array = ['color'=>'green','lightpink','type'=>'red','pink','black'];
$array1 = ['color'=>'blue','type'=>'pink','black'];
$array2 = array_intersect_key($array,$array1);
printf('<pre>%s</pre>',print_r($array2,true));
echo '<hr>';
输出:
Array
(
[color] => green
[0] => lightpink
[type] => red
)
10.array_count_values()
函数返回一个数组:数组的键是array里value的值,数组的值是array出现的次数
示例:
$array = [1,2,3,'hello','the','world','the',1,2];
print_r(array_count_values($array));
输出:
Array
(
[1] => 2
[2] => 2
[3] => 1
[hello] => 1
[the] => 2
[world] => 1
)
回调函数
1.array_filter()
用回调过滤数组中的单元,返回计算结果为true的元素组成的数组
$arr = [150,'php',true,[4,5,6],(new class{}),[],null,false,'',0,'0'];
$res = array_filter($arr,function($item){
return $item;
});
$res = array_filter($arr);
// 只返回标量的数据
$res = array_filter($arr,function($item){
return is_scalar($item);
});
printf('<pre>%s</pre><hr>',print_r($res,true));
echo '<hr>';
2.array_map()
为数组中的每个元素应用回调函数进行处理,返回新数组,通常用在数组过滤中
实例:
$arr = ['php',[3,4,5],(new class{public $name = '电脑';public $price = 8888;}),15,20];
$res = array_map(function($item){
switch(gettype($item)){
case 'object':
$item = get_object_vars($item);
case 'array':
$item = implode(',',$item);
}
return $item;
},$arr);
printf('<pre>%s</pre><hr>',print_r($res,true));
echo '<hr>';
输出
Array
(
[0] => php
[1] => 3,4,5
[2] => 电脑,8888
[3] => 15
[4] => 20
)
2.array_map():
同时处理多个数组,可以同时进行合并
实例:
```php
$key = ['host','username','password'];
$values = ['localhost','root','123456'];
$res = array_combine($key,$values);
$res = array_map(function($value1,$value2){
return [$value1 => $value2];
},$key,$values);
printf('<pre>%s</pre>',print_r($res,true));
echo $res[2]['password'];
echo '<hr>';
```
输出:
Array
(
[0] => Array
(
[host] => localhost
)
[1] => Array
(
[username] => root
)
[2] => Array
(
[password] => 123456
)
)
3.array_reduce():迭代处理数组元素
示例:
```php
function my_array_reduce($array,$callback,$init=null){
$prev = $init;
foreach($array as $current) {
$prev = $callback($prev,$current);
}
return $prev;
}
$result = my_array_reduce($res,function($prev,$current){
// 获取当前元素的键
$key = key($current);
// 获取当前元素的值
$value = current($current);
// 拼装成键值对
$prev[$key] = $value;
return $prev;
});
printf('自定义迭代:<pre>%s</pre><hr>',print_r($result,true));
echo '<hr>';
$res = array_reduce($res,function($prev,$current){
// 获取当前元素的键
$key = key($current);
// 获取当前元素的值
$value = current($current);
// 拼装成键值对
$prev[$key] = $value;
return $prev;
});
printf('内置的数组迭代:<pre>%s</pre>',print_r($res,true));
```
输出:
Array
(
[host] => localhost
[username] => root
[password] => 123456
)
4.array_walk()
使用自定义回调对数组成员组个处理,返回布尔值
实例:
// 主要用于数组成员的格式化,不受数组指针影响
$res = ['id' => 10,'name' => '张三','email' => '123@qq.com'];
// array_walk(数组,回调,回调的第三个数组的默认值)
array_walk($res,function($value,$key,$color){
printf('[%s] => <span style = "color:%s">%s</span><br>',$key,$color,$value);
},'yellow');
输出:
[id] => 10
[name] => 张三
[email] => 123@qq.com
array_slice()
array_slice()
与array_splice
两个函数,可以认为另一个是加强版,slice是从数组中截取一段,splice是可以实现数组的删除与替换
示例:
// array_slice();从数组取出一部分
$array = ['id'=>'1','name'=>'张三','age'=>'19','class'=>'1988'];
$output = array_slice($array,0);
printf('<pre>%s</pre>',print_r($output,true));
// 获取前两个
$output = array_slice($array,0,2);
printf('<pre>%s</pre>',print_r($output,true));
// 获取中间两个
$output = array_slice($array,-3,2);
printf('<pre>%s</pre>',print_r($output,true));
// 第二个参数支持复数
$output = array_slice($array,1,-1);
printf('<pre>%s</pre>',print_r($output,true));
echo '<hr>';
输出
Array
(
[id] => 1
[name] => 张三
[age] => 19
[class] => 1988
)
Array
(
[id] => 1
[name] => 张三
)
Array
(
[name] => 张三
[age] => 19
)
Array
(
[name] => 张三
[age] => 19
)
2.array_splice()
// 删除数组中的一部分并用其他值代替
$array = [1,2,3,4,5,6,7,8];
printf('原始数组元素:<pre>%s</pre>',print_r($array,true));
// 删除元素
$result = array_splice($array,1,2);
printf('<pre>%s</pre>',print_r($array,true));
// 替换功能
$result = array_splice($array,1,2,[888,999]);
printf('<pre>%s</pre>',print_r($array,true));
// 添加
$res = array_splice($array,1,0,[55,66]);
printf('<pre>%s</pre>',print_r($array,true));
// 负数的添加
$res = array_splice($array,-3,2,[44,33,11]);
printf('<pre>%s</pre>',print_r($array,true));
输出
原始数组元素:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
[6] => 7
[7] => 8
)
Array
(
[0] => 1
[1] => 4
[2] => 5
[3] => 6
[4] => 7
[5] => 8
)
Array
(
[0] => 1
[1] => 888
[2] => 999
[3] => 6
[4] => 7
[5] => 8
)
Array
(
[0] => 1
[1] => 55
[2] => 66
[3] => 888
[4] => 999
[5] => 6
[6] => 7
[7] => 8
)
Array
(
[0] => 1
[1] => 55
[2] => 66
[3] => 888
[4] => 999
[5] => 44
[6] => 33
[7] => 11
[8] => 8
)
总结
通过几个简单的实例,我们可以看到,数组函数已经将我们大部分工作给代替了,不用为了实现一个数组排序,而写一大堆代码,我想这应该就是php语言的特点之一,这些函数,有简单获取键名、值的,有复杂的,进行回调处理。包含的东西非常多,在以后的工作当中,肯定会用到的,数组函数是一个很重要的知识块,每天学习一点点,才能在最后用到的时候,想起来有这么一个函数,能够解决这些问题。