PHP 常用数组函数
PHP手册
https://www.php.net/manual/zh/ref.array.php
函数 | 作用 | 语法 |
---|---|---|
count() | 计算数组中的单元数目或对象中属性个数 | int count( mixed $var [,int $mode]) |
array_key_exists() | exists存在的意思,用来判断数组有没有某一个键(key) | bool array_key_exists( mixed $key, array $search ) |
array_flip() | 交互数组中的键和值,得到一个反转后的数组(就是键变成值,值变成键) | array array_flip( array $trans ) |
array_change_key_case() | ||
array_count_values() | ||
array_fill() | ||
array_filter() | ||
array_values() | ||
array_keys() | ||
in_array() | 判断数组某个值存不存在 | bool in_array($array) |
array_push() | ||
array_pop() | ||
array_shift() | ||
array_unshift() | ||
sort() | ||
resort() | ||
usort() | ||
asort() | ||
ksort() | ||
natsort() | ||
natcasesort() | ||
array_merge() | ||
array_merge_recursive() | ||
array_diff() | ||
array_diff_assoc() | ||
array_intersect() | ||
array_intersect_assoc() | ||
array_flip() | ||
array_unique() | ||
array_reverse() | ||
array_sum() | ||
shuffle() | ||
range() | ||
srand() | ||
array_rand() |
count()
计算数组中的单元个数,这个函数是最常见的
$arr = array('a', 'b', 'c', 'd'); echo count($arr); // 4
在PHP5中count()函数不仅可以计算数组/对象,还可以计算非数组,但是在PHP7.4中这样做会报警告warning
/** * Warning: count(): Parameter must be an array or an object that implements Countable in…… * 通过强制类型转换成数组避免Warning,模拟在PHP5下运行的结果 * (array)$str 字符串转成数组类型 * (array)$nu NULL转成数组类型 * * 字符串返回 1 * NULL返回 0 * */ $str = 'abcd'; echo count((array)$str),'<br/>'; // 1 $nu = null; echo count((array)$nu); // 0
深入一下,计算的$arr数组有几个单元
$arr = array('a', 'b', 'c', array('d', 'e')); echo count($arr); // 4
count( $arr, true ) 第二个参数为true,作用是递归计算二维数组的单元个数
$arr = array('a', 'b', 'c', array('d', 'e')); echo count($arr, true); // 6
递归的思想,如果某单元是数组,就继续进去数单元的数量
1. 第一层 a, b, c, arrar(d,e) 一共是4个单元
2. 第4个单元有又是数组,递归进去继续数,里面有d, e 共2个单元,结果是返回6
换一个三维数组
$arr = array('a', 'b', 'c', array('d', 'e', array('f', 'g'))); echo count($arr, true); // 9
array_key_exists()
如果判断数组中有没有定义 chun 这个索引
$season = array('spring'=>'春', 'summer'=>'夏', 'autumu'=>'秋', 'winter'=>'冬'); echo $season['chun']; // Notice: Undefined index: chun in……
判断数组有没有 $season['chun'] 这个单元,有两种办法
1. isset()
2. array_key_exists()
isset() 方法就是用来判断变量存不存在的
$season = array('spring'=>'春', 'summer'=>'夏', 'autumu'=>'秋', 'winter'=>'冬'); if(isset($season['chun'])){ echo $season['chun']; }else{ echo '$season[\'chun\']不存在'; // $season['chun']不存在 }
引用一个变量时,最好判断一下,尤其页面牵扯到一些安全性内容的时候
因为 008.php 文件在服务器上的路径都打印出来了 Notice: Undefined index: chun in D:\……\008.php on line 114
这将带来风险,尽量不要暴露出来,所以引用变量前最好加一个判断
bool array_key_exists( mixed $key, array $array ) 第二个方法用数组专门的函数
$season = array('spring'=>'春', 'summer'=>'夏', 'autumu'=>'秋', 'winter'=>'冬'); if(array_key_exists('chun', $season)){ echo $season['chun']; }else{ echo '$season[\'chun\']不存在'; // $season['chun']不存在 }
用 isset() 判断和 array_key_exists() 判断有什么区别?
1. isset() 不是函数是语言结构,而 array_key_exists() 是函数
速度上 isset() 省去了函数调用,速度要快一些
2. isset() 是根据值来判断的,如果某个单元的值为null,依然是返回false
比如 $season['MeiYou'] = NULL 的值为NULL,用isset判断返回为false
3. isset()是用来判断变量是否设置的,不限于数组
$season = array(0=>'零号单元', 'MeiYou'=>NULL, 'spring'=>'春', 'summer'=>'夏', 'autumu'=>'秋', 'winter'=>'冬'); if(isset($season['MeiYou'])){ echo $season['MeiYou']; }else{ echo '$season[\'MeiYou\']不存在'; // $season['MeiYou']不存在 }
array_key_exists 和 isset对比
$season = array(0=>'零号单元', 'MeiYou'=>NULL, 'spring'=>'春', 'summer'=>'夏', 'autumu'=>'秋', 'winter'=>'冬'); var_dump($season['MeiYou']); // NULL var_dump(isset($season[0])); // bool(true) var_dump(isset($season['MeiYou'])); // bool(false) var_dump(array_key_exists('MeiYou', $season)); // bool(true)
array array_flip( array $array ) 交换数组中的键和值
$arr = array(0=>'a', 1=>'b', 2=>'c'); print_r($arr); // Array ( [0] => a [1] => b [2] => c ) print_r(array_flip($arr)); // Array ( [a] => 0 [b] => 1 [c] => 2 )
键值对调后出现有两个重复的键b,而数组的键是不可能重复的,这种情况怎么办?后面的 ['b']=>2 覆盖前面的 ['b']=>1
$arr = array(0=>'a', 1=>'b', 2=>'b', 3=>'c'); print_r($arr); // Array ( [0] => a [1] => b [2] => b [3] => c ) print_r(array_flip($arr)); // Array ( [a] => 0 [b] => 2 [c] => 3 ) /** * 再调用原数字$arr返回:Array ( [0] => a [1] => b [2] => b [3] => c ) * 原数组并没有变,因为参数只是作为参数传给函数而已 * */ print_r($arr); // Array ( [0] => a [1] => b [2] => b [3] => c )
bool in_array( mixed $needle, array $haystack, bool $strict = false )
array_key_exists() 函数判断数组某个 键 存不存在,
in_array() 判断数组中的某个 值 存不存在
$arr = ['小明', '小华', '老王', '小刚', '老李']; var_dump(in_array('小刚', $arr)); // bool(true) var_dump(in_array('不锈钢', $arr)); // bool(false)
自己实现这个功能
思路:用foreach循环,在循环中挨个单元判断
比如,找数组中有没有"小刚",把数组中每个过单元的值与"小刚"比较
/** * bool inArray( mixd $seach, array $array) * $array 被查找的数组 * $seach 要查找的值 * */ function inArray($seach, $array){ $find = false; foreach($array as $val){ if($val === $seach){ $find = true; break; } } return $find; } $arr = ['小明', '小华', '老王', '小刚', '老李']; var_dump(inArray('小刚', $arr)); // bool(true) var_dump(inArray('不锈钢', $arr)); // bool(false)
range()
array range( mixed $low, mixed $high [,number $step] ) 作用是生成一个指定范围的数组
$arr = range(3, 6); print_r($arr); // Array ( [0] => 3 [1] => 4 [2] => 5 [3] => 6 )
从6到1生成数组
print_r(range(6, 1)); // ( [0] => 6 [1] => 5 [2] => 4 [3] => 3 [4] => 2 [5] => 1 )
自己写代码实现
要求写一个 array_num($m, $n) 函数,实现下面的要求
1. 给定两个整数值,分别是m 和 n
2. m小于n:m < n
3. 生成一个数组,数组里单元的值分别是 m+0 m+1, m+2, m+3……m+n
我自己写的
function array_num($m, $n){ $arr = []; if(!is_int($m) || !is_int($n)){ return false; } if($m > $n){ return false; } for($i = 0; $m < $n; $i++){ $arr[$i] = $m +=1; } return $arr; } $arr = array_num(3, 6); var_dump($arr); // array(3) { [0]=> int(4) [1]=> int(5) [2]=> int(6) } print_r($arr); // Array ( [0] => 4 [1] => 5 [2] => 6 )
燕十八老师写的,循环的地方跟我写的有点不一样,效果是一样的
function array_num($m, $n){ $arr = []; if(!is_int($m) || !is_int($n)){ return false; } if($m > $n){ return false; } for($i = $m; $m < $n; $i++){ $arr[] = ($i == $m)? $m += 0 : $m += 1; } return $arr; } $arr = array_num(3, 6); var_dump($arr); // array(4) { [0]=> int(3) [1]=> int(4) [2]=> int(5) [3]=> int(6) } print_r($arr); // Array ( [0] => 3 [1] => 4 [2] => 5 [3] => 6 )
array_sum()
number array_sum( array $array ) 计算数组所有单元值的和
$arr = [3, 4, 5, 6]; echo array_sum($arr); // 18
shuffle()
bool shuffle( array &$array ) 每次刷新都不一样,随机生成验证码时候可以用到此函数
函数是引用传值,传进去的数组本身改变了
$arr = [0=>3, 1=>4, 2=>5, 3=>6]; if(shuffle($arr)){ print_r($arr); // Array ( [0] => 4 [1] => 6 [2] => 5 [3] => 3 ) }
unique()
array array_unique( array $array ) 去重函数,作用是移除数组中重复的值,unique英语里是唯一的意思
$a = ['e', 'c', 'a', 'b', 'c', 'd', 'b', 'e', 'a', 'c', 'e', 'a']; $b = array_unique($a); print_r($b); // ( [0] => e [1] => c [2] => a [3] => b [5] => d )
自己想的去重思路
1. 新建一个空数组 $a
2. 然后循环待处理数组 $b
3. 取出$b每一个单元,先判断$a中有没有此单元
4. 如果有跳过,如果没有添加进去
下面是燕十八老师应要求写了一个去重函数
function my_array_unique($array){ $temporary = array(); foreach($array as $key=>$value){ if(!in_array($value, $temporary)){ $temporary[$key] = $value; } } return $temporary; } $a = ['e', 'c', 'a', 'b', 'c', 'd', 'b', 'e', 'a', 'c', 'e', 'a']; $b = my_array_unique($a); print_r($b); // ( [0] => e [1] => c [2] => a [3] => b [5] => d )
array_reverse()
array array_reverse( array $array [,bool $preserve_keys] ) 逆转数组单元的排列顺序
$direction = array('north '=>'北', 'west'=>'西', 'south'=>'南', 'east'=>'东'); print_r(array_reverse($direction)); // ( [east] => 东 [south] => 南 [west] => 西 [north ] => 北 )
如果是数字索引,键的顺序默认不反转,而是从新从0开始自动增加
$direction = array('北', '西', '南', '东'); print_r(array_reverse($direction)); // ( [0] => 东 [1] => 南 [2] => 西 [3] => 北 )
如果想让索引也反转,第二个参数设置为true,意思是值保持原先的对应关系一起反转
$direction = array('北', '西', '南', '东'); print_r(array_reverse($direction, true)); // Array ( [3] => 东 [2] => 南 [1] => 西 [0] => 北 )
自己写代码实现逆转功能
思路:
1.新建一个数组$a
2.把待处理数组$b的最后一个单元读取出来,放到新数组$a的第一位
3.再把数组$b的最后一个单元unset掉
4.循环2,3……直到数组$b为空
function my_array_reverse($array){ $tem = []; while(count($array)){ end($array); $tem[key($array)] = current($array); unset($array[key($array)]); } if(count($array) == 0){ return $tem; } } $direction = array('north '=>'北', 'west'=>'西', 'south'=>'南', 'east'=>'东'); $reverseDir = my_array_reverse($direction); print_r($reverseDir); // ( [east] => 东 [south] => 南 [west] => 西 [north ] => 北 )
数据结构的知识
队列:先进先出
新人来的,排队排在后面,前面的人先进。
栈:后进先出
单行道,后进去的人,反而能先出去
array_push()
int array_push( array &$array ,mixed $var [,mixed $..] )
作用:
1. 在数组结尾插入一个或多个单元压入,push英语里有推的意思
2. 返回值int类型,是数组最新的长度
3. array_push()是引用传值,直接影响参数的数组本身
$arr = []; echo array_push($arr, '东'),'<br/>'; // 1 print_r($arr); // Array ( [0] => 东 ) echo '<br/>'; echo array_push($arr, '南'),'<br/>'; // 2 print_r($arr); // Array ( [0] => 东 [1] => 南 ) echo '<br/>'; echo array_push($arr, '西'),'<br/>'; // 3 print_r($arr); // Array ( [0] => 东 [1] => 南 [2] => 西 ) echo '<br/>'; echo array_push($arr, '北'),'<br/>'; // 4 print_r($arr); // Array ( [0] => 东 [1] => 南 [2] => 西 [3] => 北 )
array_pop()
mixed array_pop( array &$array )
作用:将数组最后一个单元弹出(出栈)
返回值mixed类型,返回数组的最后一个单元,并且将数组长度减一,如果数组为空或不是数组返回NULL
$direction = Array (0=>'东', 1=>'南', 2=>'西', 3=>'北'); print_r($direction); // Array ( [0] => 东 [1] => 南 [2] => 西 [3] => 北 ) echo '<br/>'; echo array_pop($direction),'<br/>'; // 北 print_r($direction); // Array ( [0] => 东 [1] => 南 [2] => 西 ) echo '<br/>'; echo array_pop($direction); // 西 print_r($direction); // Array ( [0] => 东 [1] => 南 ) echo '<br/>'; echo array_pop($direction); // 南 print_r($direction); // Array ( [0] => 东 ) echo '<br/>'; echo array_pop($direction); // 东 print_r($direction); // Array ( ) echo '<br/>'; var_dump(array_pop($direction)); // NULL /** * 1.作用是弹出,并去掉最后一个单元 * 2.返回值是弹出的值 * 3.引用传参,直接影响参数数组的值 * */
array_shift()
mixed array_shift( array &$array ) 将数组开头的单元移出数组和array_pop正相反
1. 将数组的第一个单元移出并作为结果返回
2. 数组的长度减一,并将剩下索引单元向前移动一位,所有数字键名将从零开始计数,如果是关联下标名不影响
3. 如果数组为空或不是数组返回NULL
4. array_shift()参数是引用传值,将影响参数数组的结果
$direction = Array (0=>'东', 1=>'南', 'west'=>'西', 3=>'北'); print_r($direction); // Array ( [0] => 东 [1] => 南 [west] => 西 [3] => 北 ) echo '<br/>'; echo array_shift($direction); // 东 print_r($direction); // Array ( [0] => 南 [west] => 西 [1] => 北 ) echo '<br/>'; echo array_shift($direction); // 南 print_r($direction); // Array ( [west] => 西 [0] => 北 ) echo '<br/>'; echo array_shift($direction); // 西 print_r($direction); // Array ( [0] => 北 ) echo '<br/>'; echo array_shift($direction); // 北 print_r($direction); // Array ( ) echo '<br/>'; var_dump(array_shift($direction)); // NULL
array_unshift()
int array_unshift( array &$array, mixed $var [,mixed $../] ) 和 array_push 类似,在数组开头插入一个或多个单元
1. 单元是作为整体被插入的,因此传人单元将报错同样的顺序
2. 所有数值键名将修改为从零开始重新计数,所有文字键名保持不变
3. 引用传参
$direction = Array(); echo array_unshift($direction, '东').'<br/>'; // 1 print_r($direction); // Array ( [0] => 东 ) echo '<br/>'; echo array_unshift($direction, '南').'<br/>'; // 2 print_r($direction); // Array ( [0] => 南 [1] => 东 ) echo '<br/>'; echo array_unshift($direction, '西').'<br/>'; // 3 print_r($direction); // Array ( [0] => 西 [1] => 南 [2] => 东 ) echo '<br/>'; echo array_unshift($direction, '北').'<br/>'; // 4 print_r($direction); // Array ( [0] => 北 [1] => 西 [2] => 南 [3] => 东 )
array_chunk()
array array_chunk( array $array, int $length, bool $preserve_keys = false )
$numStr = '1234567890'; $tem = []; for($i=0; strlen($numStr) > $i; $i++){ $tem[] = $numStr[$i]; } print_r($tem); // Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7 [7] => 8 [8] => 9 [9] => 0 ) $arr = array_chunk($tem, 3); print_r($arr); /* Array ( [0] => Array ( [0] => 1 [1] => 2 [2] => 3 ) [1] => Array ( [0] => 4 [1] => 5 [2] => 6 ) [2] => Array ( [0] => 7 [1] => 8 [2] => 9 ) [3] => Array ( [0] => 0 ) ) ***/