Go to comments

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
    )
)
***/



Leave a comment 0 Comments.

Leave a Reply

换一张