PHP7语言基础——数组

使用数组

数组的本质是用来存储、管理和操作一组变量。PHP中的数组实际上是一个有序映射,映射是一种把values关联到keys的类型。

数组类型

PHP中有两种类型的数组,即索引数组和关联数组。索引数组的键由数字组成,在没有特别指定时,数组默认为索引数组。关联数组的键由字符串和数字混合组成。

  1. 关联数组:

    $array = array('a'=>'foo', 'b'=>'bar')
    
  2. 索引数组:

    $array = array(1=>'foo', 2=>'bar')
    

在数组中,如果未指定键,PHP就将自动使用之前用过的最大的数字键加1作为新的键。

【示例】

<?php
$array1 = array("foo", "bar", "hallo", "world");
var_dump($array1)
echo "<br />"$array2 = array(
	"a",
	"b",
	6=>"c",
	"d",
);
var_dump($array2);
?>

以上代码输出结果为:

在这里插入图片描述

代码解析:

以上代码中$array1没有指定键名,所以默认数组为索引数组,$array2中最后一个值"d"被自动赋予键名7,因为之前最大整数键名是6。

创建数组

可以使用array()创建数组,除此之外还可以使用方括号[]创建数组,还可以使用range()函数来建立一个包含指定范围单元的数组。

array range(mixed $start, mixed $limit[, number $step=1])

其中start是序列的第一个值,序列结束语limit的值。如果给出了step的值,它将被作为单元之间的步进值。step应该为正值,如果未指定,step默认为1。

二维数组和多维数组

二维数组

将两个以为数组组合起来就可以构成一个二维数组,使用二维数组可以保存较为复杂的数据。

【示例】

<?php
$person = array(
	'lily'=>array('age'=>20, 'weight'=>'50kg', 'hobby'=>'sleep'),
	'Tom'=>array('age'=>12, 'weight'=>'40kg', 'hobby'=>'eat'),
	'Andy'=>array('age'=>30, 'weight'=>'70kg', 'hobby'=>'write')
);
print_r($person);
?>

输出结果:
在这里插入图片描述

代码解析:

数组person中的元素lilyTomAndy对应的值分别是一个以为数组,这3个以为数组组成了一个二维数组。

多维数组

同二维数组一样,可以很容易的创建三维数组、四维数组或者其他更高维数的数组。实际上可以将所有数组都认为是以为数组,只不过其元素依然可以是数组,如果元素也是以为数组就组成了二维数组,如果元素是二维数组就组成了三维数组,以此类推。

PHP中对多维数组没有上限的固定限制,但是随着维度的增加数组会越来越复杂,对于阅读调试和维护都会变得困难。

数组操作

检查数组中是否存在某个值

in_array函数判断数组中是否存在某个值。

说明:


in_array(mixed $needle, array $haystack[, bool $strict=FALSE]):bool

haystack中搜索needle,如果没有设置strict,就是用宽松的比较。如果strict的值为true,则in_array()函数还会检查needle的类型是是否和`haystack中的相同。

参数:


  • needle
    待搜索的值。如果needle是字符串,则比较是区分大小写的。
  • haystack
    待搜索的数组。
  • strict
    如果第三个参数strict的值为TRUEin_array()函数还会检查needle的类型是否和haystack中相同

返回值:


如果找到needle则返回TRUE,否则返回FALSE。

【示例】

<?php
$arr = array(
	'安徽'=>array(
		'阜阳'=>array('阜南县','临泉县','颍州区'),
		'宿州'=>array('墉桥区','灵璧县','泗县'),
		'合肥'=>array('蜀山区','长丰县','肥东'),
	),
	'河南'=>array(
		'洛阳'=>array('西工区','老城区','孟津县'),
		'郑州市'=>array('中原区','金水区'),
	),
);
var_dump(in_array('阜南县', $arr));		//false
$arr1 = ['red', 'green', 'black'];
var_dump(in_array('green', $arr1));		//true
?>

代码解析:

由于没有设置strict的值,因此in_array()只做了一级检查,只在当前维度检查是否包含相应元素,而不会递归到数组中的每个元素。

数组转换为字符串

使用implode()函数可以将一个一维数组转化为字符串。

说明:


implode(string $glue, array $pieces):string
implode(array $pieces):string

该函数用$glue将一维数组$pieces的值连接为一个字符串。

参数:


  • glue
    默认为空的字符串。
  • pieces
    带转换为字符串的数组。

返回值:


返回一个字符串,其内容为glue分割开的数组的值。

此函数可以安全用于二进制对象。

【示例】

<?php
$arr = array('lastname', 'emial', 'phone');	// 声明数组
$comma_separated = implode(",", $arr);		// 分割数组
echo $comma_separated;						// 输出结果
?>

程序输出结果:
在这里插入图片描述

代码解析:

以上代码中,使用“,”将数组的三个元素连接成了一个字符串。

计算数组中的单元数目

使用count()函数可计算数组中的单元数目,count()函数还可以计算对象中的属性个数。

说明:


count(mixed $array_or_countable[, int $mode=COUNT_NORMAL]):int

计算数组中的单元数目,或对象中的属性个数。

参数:


  • array_or_countable
    数组或者Countable对象。
  • mode
    如果可选的mode参数设置为COUNT_RECURSIVE(或1),count()将递归对数组计数。对计算对维数组的所有单元尤其有用。

返回值:


返回array_or_countable中的单元数目。如果参数既不是数组,也不是实现Countalbe接口的对象,将返回1。例外情况:如果array_or_countableNULL则结果是0。

【示例】

<?php
$food = array(
	'fruits'=>array('orange', 'banana', 'apple'),
	'veggie'=>array('carrot', 'collard', 'pea')
);
echo count($food, COUNT_RECURSIVE);		// 结果为8
echo "<br \>";
echo count($food);						// 结果为2
?>

程序输出结果:
在这里插入图片描述

代码解析:

以上代码中$food为一个二维数组,当不指定mode时,默认不会对数组进行递归计算,当指定该参数值为1或者COUNT_RECURSIVE时,则会对数组进行递归,因此结果是8。

数组当前单元和数组指针

使用current()函数可返回数组的当前单元。

说明:


current(array &$array):mixed

每个数组中都有一个内部的指针指向它“当前的”单元,初始指向插入到数组中的第一个单元。

参数:


  • array
    这个数组

返回值:


current()函数返回当前被内部指针指向的数组单元的值,并不移动指针。如果内部指针指向超出了单元列表的末端,current()返回FALSE

与数组内部指针相关的函数有:

  1. next()
    说明:

    next(array &$array):mixed
    

    next()current()的行为类似,只有一点区别,在返回值之前将内部指针向前移动一位。这意味着它返回的是下一个数组单元的值并将数组指针向前移动了一位。

    参数:


    • array
      受影响的数组

    返回值:


    返回数组内部指针指向的下一个单元的值,或当没有更多单元时返回FALSE

  2. prev()
    说明:

    将数组的内部指针倒回一位。prev()next()的行为类似,只除了它将内部指针倒回一位而不是前移一位。

    参数:


    • array
      受影响的数组

    返回值:


    返回数组内部指针指向的前一个单元的值,或当没有更多单元时返回 FALSE

  3. end()
    说明:

    end(array &$array):mixed
    

    end()array的内部指针移动到最后一个单元并返回其值。

    参数:


    • array
      受影响的数组。该数组是通过引用传递的,因为它会被这个函数修改。这意味着你必须传递一个变量,而不是函数返回的数组,因为只有真正的变量才能以引用传递。

    返回值:


    返回最后一个元素的值,或者如果是空数组则返回 FALSE

  4. reset()
    说明:

    reset(array &$array):mixed
    

    reset()array的内部指针倒回到第一个单元并返回第一个数组单元的值。

    参数:


    • array
      受影响的数组。
    • 返回值:

    返回数组第一个单元的值,如果数组为空则返回FALSE

  5. each()
    说明:


    each(array &$array):array
    

    返回数组中当前的键/值对并将数组指针向前移动一步 。

    在执行 each()之后,数组指针将停留在数组中的下一个单元或者当碰到数组结尾时停留在最后一个单元。如果要再用each 遍历数组,必须使用 reset()

    参数:


    • array
      受影响的数组。

    返回值:


    返回 array 数组中当前指针位置的键/值对并向前移动数组指针。键值对被返回为四个单元的数组,键名为01keyvalue。单元 0key 包含有数组单元的键名,1value 包含有数据。 如果内部指针越过了数组的末端,则 each()返回 FALSE

【示例】

<?php
$transport = array('foot', 'bike', 'car', 'plane');
$mode = current($transport); // $mode = 'foot';
$mode = next($transport);    // $mode = 'bike';
$mode = next($transport);    // $mode = 'car';
$mode = prev($transport);    // $mode = 'bike';
$mode = end($transport);     // $mode = 'plane';

$mode = next($transport)
var_dump($mode);			 // bool(false)
echo '<br />';

reset($transport);
// array(4) { [1]=> string(4) "foot" ["value"]=> string(4) "foot" [0]=> int(0) ["key"]=> int(0) } 
var_dump(each($transport));
echo '<br />';
// array(4) { [1]=> string(4) "bike" ["value"]=> string(4) "bike" [0]=> int(1) ["key"]=> int(1) } 
var_dump(each($transport));
?>

程序输出结果:
在这里插入图片描述

代码解析:

以上代码中,数组被声明后内部指针默认指向数组的第一个单元,因此代码中第一个mode变量的值是’foot’,next()将指针向前移动一位,并返回移动后当前单元的值,因此第二个mode的值是’bike’,经过next()后数组的指针停留在数组的第二个单元,所以第三个mode值也是’bike’,prev()将数组内部指针前移一位,指向了’foot’,end()将数组指针移动到最后一个单元,指向’plane’。

数组中的键名和值

  1. 从关联数组中取得键名
    使用key()函数可以从关联数组中返回键名。

    说明:

    key(array $array):mixed
    

    返回数组中当前单元的键名。

    参数:


    • array
      该数组。

    返回值:


    返回数组中内部指针指向的当前单元的键名。 但它不会移动指针。如果内部指针超过了元素列表尾部,或者数组是空的,key()会返回 NULL

    【示例】

    <?php
    $array = array(
    'fruit1'=>'apple',
    	'fruit2'=>'orange',
    	'fruit3'=>'grape',
    	'fruit4'=>'apple',
    	'fruit5'=>'apple');
    for($i = 0; $i < count($array); $i++) {		// 循环数组
    	echo key($array)."<br />";		// 输出指针指向当前单元的键
    	next($array);					// 将数组指针向前移动一位
    }
    ?>
    

    程序输出结果:

    在这里插入图片描述

  2. 检查给定键名或索引是否存在与数组中
    使用array_key_exists()函数检查给定键名或索引是否存在与数组中。
    说明:


    array_key_exists(mixed $key, array $array):bool
    

    数组里有键 key 时,array_key_exists() 返回 TRUEkey 可以是任何能作为数组索引的值。

    参数:


    • key
      要检查的键。
    • array
      一个数组,包含待检查的键。

    返回值:


    成功时返回 TRUE, 或者在失败时返回 FALSE

    array_key_exists()仅仅搜索第一维的键。多维数组里嵌套的键不会被搜索到。

    【示例】

    <?php
    $search_array = array('first'=>1, 'second'=>4);
    if (array_key_exists('first', $search_array)){
    	echo "The 'first' element is in the array";
    }
    ?>
    

    程序输出结果:

    在这里插入图片描述

  3. 获取数组中部门或所有键名
    使用array_keys()函数可获得数组中部分或所有键名。
    说明:


    array_keys(array $input[, mixed $search_value=null[, bool $strict=false]]):array
    

    array_keys() 返回 input数组中的数字或者字符串的键名。如果指定了可选参数 search_value,则只返回该值的键名。否则 input 数组中的所有键名都会被返回。

    参数:


    • input
      一个数组,包含了要返回的键。
    • search_value
      如果指定了这个参数,只有包含这些值的键才会被返回。
    • strict
      判断在搜索的时候是否该使用严格的比较(===)。

    返回值:


    返回input里的所有键。

    【示例】

    <?php
    $array = array(0=>100, "color"=>"red");
    echo "<pre>";
    print_r(array_keys($array));
    $array = array("blue", "red", "green", "blue", "blue");
    print_r(array_keys($array, "blue"));	// 返回数组中值为blue的键
    $array = array(
    	"color"=>array("blue", "red", "green"),
    	"size"=>array("small", "medium", "large"));
    print_r(array_keys($array));		// 只返回当前维度的数组的键
    ?>
    

    程序输出结果:

    在这里插入图片描述

  4. 获取数组中的所有值
    使用array_values()函数可获得数组中的所有值。
    说明:


    array_values(array $input):array
    

    array_values() 返回input 数组中所有的值并给其建立数字索引。

    参数:


    • array
      该数组。

    返回值:


    返回包含所有值的索引数组。

    【示例】

    <?php
    $array = array("blue", "red", "green");
    echo "<pre>";
    print_r(array_values($array));	// 返回数组$array中的所有值
    ?>
    

    程序输出结果:

    在这里插入图片描述

  5. 搜索给定值返回键名
    使用array_search()函数可以在数组中搜索给定的值,如果成功就返回相应的键。
    说明:


    array_search(mixed $needle, array $haystack[, bool $strict=false]):mixed
    

    如果在haystack中搜索到了needle,就返回它的键, 否则返回false。如果needlehaystack中不止一次出现,就返回第一个匹配的键。要返回所有匹配值的键, 应该用array_ keys()加上可选参数search_value来代替。如果可选参数strict 为true ,那么array_search()将在haystack中检查完全相同的元素。这意味着同样检查haystackneedle 的类型, 并且对象须是同一个实例。

    参数:


    • needle
      搜索的值。如果needle是字符串,则比较以区分大小写的方式进行。
    • haystack
      这个数组。
    • strict
      如果可选的第三个参数strictTRUE,则array_search()将在haystack中检查完全相同的元素。这意味着同样严格比较haystackneedle的类型,并且对象是同一实例。

    返回值:


    如果找到了 needle 则返回它的键,否则返回 FALSE。如果 needlehaystack中出现不止一次,则返回第一个匹配的键。要返回所有匹配值的键,应该用array_keys()加上可选参数 search_value 来代替。

    【示例】

    <?php
    $array = array(0=>'blue', 1=>'red', 2=>'green', 3=>'red');
    $key = array_search('green', $array);	// 查找数组中值为green的键,此时$key=2;
    $key = array_search('red', $array);	//查找数组中值为'red'的键,此时$key=1
    ?>
    

数组填充

  1. array_pad()函数
    说明:


    array_pad(array $array, int $size, mixed $value):array
    

    array_pad()返回 array 的一个拷贝,并用value 将其填补到size 指定的长度。如果 size 为正,则填补到数组的右侧,如果为负则从左侧开始填补。如果size 的绝对值小于或等于array 数组的长度则没有任何填补。有可能一次最多填补1048576 个单元。

    参数:


    • array
      需要被填充的原始数组。
    • size
      新数组的长度。
    • value
      将被填充的值,只有在 array 的现有长度小于 size 的长度时才有效。

    返回值:


    返回arrayvalue填充到size指定的长度之后的一个副本。如果size为正,则填补到数组的右侧,如果为负则从左侧开始填补。如果size的绝对值小于或等于array数组的长度则没有任何填补。

    【示例】

    <?php
    $input = array(12, 10, 9);
    echo '<pre>';
    // 从数组右侧开始,用0填充数组到含有5个元素
    $result = array_pad($input, 5, 0);
    print_r($result);
    // 从数组左侧开始,用-1填充数组到含有7个元素
    $result = array_pad($input, -7, -1);
    print_r($result);
    // 第二个谙熟小于数组长度,不填充
    $result = array_pad($input, 2, "noop");
    print_r($result);
    ?>
    

    程序输出结果:

    在这里插入图片描述

  2. array_fill()函数
    该函数可以用给定的值填充数组。
    说明:


    array_fill(int $start_index, int $num, mixed $value):array
    

    array_fill()value参数的值将一个数组填充num个条目,键名由start_index参数指定的开始。

    参数:


    • start_index
      返回的数组的第一个索引值。如果start_index是负数,那么返回的数组的第一个索引将会是start_index,而后面索引则从0开始。
    • num
      插入元素的数量。必须大于或等于0.
    • value
      用来填充的值。

    返回值:


    返回填充后的数组。

    【示例】

    <?php
    // 使用banana填充数组到6个元素,索引键由数字5开始
    $a = array_fill(5, 6, "banana");
    // 使用pear填充数组到4个元素,索引建由-2开始
    $b = array_fill(-2, 4, 'pear');
    // 用一个数组填充成一个二维数组
    $c = array_fill(3, 2, array('green', 'red', 'blue'));
    echo '<pre>';
    print_r($a);
    print_r($b);
    print_r($c);
    ?>
    

    程序输出结果:

    在这里插入图片描述

  3. array_fill_keys()函数
    该函数使用指定的键和值填充数组。
    语法:


    array_fill_keys(array $keys, mixed $value):array
    

    使用value参数的值作为值,使用keys数组的值作为键来填充一个数组。

    参数:


    • keys
      使用该数组的值作为键。非法值将被转换为字符串。
    • value
      填充使用的值。

    返回值:


    返回填充后的数组

    【示例】

    <?php
    $keys = array('foo', 5, 10, 'bar');
    // 使用$keys数组的值作为键,banana作为值重新组建一个数组
    $a = array_fill_keys($keys, "banana");
    // 使用$keys的值作为键,另一个数组作为元素,组成一个新的二维数组
    $b = array_fill_keys($keys, array('red', 'green', 'blue'));
    echo '<pre>';
    print_r($a);
    print_r($b);
    ?>
    

    程序输出结果:

    在这里插入图片描述

从数组中随机去除一个或多个单元

array_rand()函数可以从数组中取出一个或多个随机的单元,并返回随机条目的一个或多个键。

说明:


array_rand(array $array[, int $num=1]):mixed

从数组中取出一个或多个随机的单元,并返回随机条目的一个或多个键。 它使用了伪随机数产生算法,所以不适合密码学场景。

参数:


  • array
    输入的数组。
  • num
    指明了想取出多少个单元。

返回值:


如果只取出一个,array_rand()返回随机单元的键名。否则就返回包含随机键名的数组。完成后,就可以根据随机的键获取数组的随机值。取出数量如果超过array的长度,就会导致E_WARNING错误,并返回NULL

【示例】

<?php
$input = array("Neo", "morpheus", "Trinity", "Cypher", "Tank");
// 从$input数组中随机取出2个单元,组成一个新的数组
$rand_keys = array_rand($input, 2);
echo '<pre>';
print_r($rand_keys);
?>

程序输出结果:

在这里插入图片描述

数组排序与打乱数组

  1. sort()函数
    说明:


    srot(array &$array[, int $sort_flags=SORT_REGULAR]):bool
    

    本函数对数组进行排序。当本函数结束时数组单元将被从最低到最高重新安排。

    参数:


    • array
      要排序的数组
    • sort_flags
      可选的第二个参数sort_flags可以用以下值改变排序的行为:
      排序类型标记:
      • SORT_REGULAR-正常比较单元(不改变类型)
      • SORT_NUMERIC-单元被作为数字来比较
      • SORT_STRING-单元被作为字符串来比较
      • SORT_LOCAL_STRING-根据当前的区域(local)设置来把单元当做字符串比较,可以用setlocal()来改变
      • SORT_NATURAL-和natsor()类似对每个单元以“自然的顺序”对字符串进行排序。(PHP5.4.0中新增)
      • SORT_FLAG_CASE-能够与SORT_STRING或SORT_NATURAL合并(OR位运算),不区分大小写排序字符串。

    返回值:


    成功时返回TRUE,或者在失败时返回FALSE

    【示例】

    <?php
    $fruits = array("lemon", "banana", "apple");
    sort($fruits);		// 数组排序
    echo '<pre>';
    print_r($fruits);
    ?>
    

    程序输出结果:

    在这里插入图片描述

  2. asort()函数
    说明:


    asort(array &$array[, int $sort_flags=SORT_REGULAR]):bool
    

    本函数对数组进行排序,数组的索引保持和单元的关联。主要用于对那些单元顺序很重要的结合数组进行排序。

    参数:


    • array
      输入数组。
    • sort_flags
      可以用可选的参数sort_flags改变排序的行为,取值与sort()一样。

    返回值:


    成功时返回TRUE,或者在失败时返回FALSE

    【示例】

    <?php
    $fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
    asort($fruits);		// 数组排序
    echo '<pre>';
    print_r($fruits);
    ?>
    

    程序输入结果:

    在这里插入图片描述

  3. arsort()函数
    说明:


    arsort(array &$array[, int $sort_flags=SORT_REGULAR]):bool
    

    本函数对数组进行逆向排序,数组的索引保持和单元的关联。主要用于对那些单元顺序很重要的结合数组进行排序。

    参数:


    • array
      输入的数组
    • srot_flags
      可以用可选的参数sort_flags改变排序的行为,取值与sort()一样。

    返回值:


    成功时返回TRUE,或者在失败时返回FALSE

    【示例】

    <?php
    $fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
    arsort($fruits);		// 数组排序
    echo '<pre>';
    print_r($fruits);
    ?>
    

    程序输出结果:

    在这里插入图片描述

  4. rsort()函数
    说明:


    rsort(array &$array[, int $sort_flags=SORT_REGULAR]):bool
    

    对数组进行逆向排序,但是不保持索引关系。

    参数:


    • array
      输入的数组。
    • srot_flags
      可以用可选的参数sort_flags改变排序的行为,取值与sort()一样。

    返回值:


    成功时返回TRUE,或者在失败时返回FALSE

    【示例】

    <?php
    $fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
    rsort($fruits);		// 数组排序
    echo '<pre>';
    print_r($fruits);
    ?>
    

    程序输出结果:

    在这里插入图片描述

  5. shuffle()函数
    说明:


    shuffle(array &$array):bool
    

    本函数打乱(随机排列单元的顺序)一个数组。 它使用的是伪随机数产生器,并不适合密码学的场合。

    参数:


    • array
      待操作的数组。

    返回值:


    成功时返回TRUE,或者在失败时返回FALSE

    【示例】

    <?php
    $numbers = range(1, 20);
    echo "打乱之前";
    foreach($numbers as $number){
    	echo "$number ";
    }
    shuffle($numbers);		// 打乱数组顺序
    echo "<br />打乱之后";
    foreach($numbers as $number){
    	echo "$number ";
    }
    ?>
    

    程序输出结果:

    在这里插入图片描述

遍历数组

编程中常用for、foreach、each(PHP7.2已弃用)、list对数组进行遍历。

  1. for循环遍历数组
    【示例】

    <?php
    $fruits = array("lemon", "orange", "banana", "apple");
    for($i = 0; $i < count($fruits); $i++) {
    	echo current($fruits)."\n";
    	echo $fruits[$i]."<br />";
    }
    ?>
    

    程序运行结果:

    在这里插入图片描述

    从以上代码的运行可以看到,for循环遍历数组的形式没有改变数组的内部指针。

  2. foreach遍历数组
    【示例】

    <?php
    $array=[0, 1, 2];
    foreach($array as &$val){	//遍历数组
    	echo $val;
    }
    ?>
    

    以上程序会输出:012

    【示例2】

    <?php
    $array=[0, 1, 2];
    foreach($array as &$val){
    	//遍历数组,使用current()输出数组指针指向的当前单元的值
    	var_dump(current($array));
    }
    ?>
    

    在PHP7中,输出结果为:

    在这里插入图片描述

    在PHP7之前的版本中输出结果为:

    在这里插入图片描述
    【示例3】

    <?php
    $array = [0, 1, 2];
    foreach($array as $val){
    	$var = $val * 2;	// 元素值乘以2
    }
    var_dump($array);
    ?>
    

    程序输出结果:

    在这里插入图片描述
    通过以上代码可以看出,foreach循环是对数组的备份进行操作,在循环内部修改数组不会对循环之外访问数组有影响。

    但如果是按照引用循环,那么在循环内部对数组做的修改会影响数组本身。

  3. each()和list()
    each()函数返回数组中当前的键值并将数组指针向前移动。在执行each()之后,数组指针将停留在数组中的下一个单元后者当碰到数组结尾时停留在最后一个单元。如果再要用each遍历数组,需要使用reset()。

    <?php
    echo "<pre>";
    $foo = array("bob", "fred", "jussi", "jouni", "egon", "marliese");
    $bar1 = each($foo);	// 指针向后移动一位
    print_r($bar1);
    echo current($foo);	// 当前指针
    echo "<br />";
    $bar2 = each($foo);
    print_r($bar2);
    echo current($foo);
    ?>
    

    程序输出结果:

    在这里插入图片描述

    注意:each()函数在PHP7.2中已弃用。

    each()函数和list()函数结合使用可以遍历数组:

    【示例】

    <?php
    $fruit = array('a'=>'apple', 'b'=>'banana', 'c'=>'cranberry');
    while(list($key, $val)=each($fruit)){
    	echo "$key=>$val<br />";
    }
    ?>
    

    list()结构:

    把数组中的值赋给一组变量。

    说明:


    list(mixed $var1[, mixed $...]):array
    

    array()一样,这不是真正的函数,而是语言结构。list()可以在单次操作内就为一组变量赋值。

    在 PHP 7.1.0 之前的版本,list()仅能用于数字索引的数组,并假定数字索引从 0 开始。

    PHP 5 里,list() 从最右边的参数开始赋值;PHP 7 里,list()从最左边的参数开始赋值。 如果你用单纯的变量,不用担心这一点。但是如果你用了具有索引的数组,通常你期望得到的结果和在list() 中写的一样是从左到右的,但在 PHP 5 里实际上不是,它是以相反顺序赋值的。

数组的拆分与合并

  1. array_chunk()函数
    说明:


    array_chunk(array $array, int $size[, bool $preserve_keys=false]):array
    

    将一个数组分割成多个数组,其中每个数组的单元数目由size决定。最后一个数组的单元数目可能会少于size个。

    参数:


    • array
      需要操作的数组
    • size
      每个数组的单元数目
    • preserve_kyes
      设为TRUE,可以使PHP保留输入数组中原来的键名。如果指定为FALSE,那每个结果数组将用从零开始的新数字索引。默认值是FALSE

    返回值:


    得到数组是一个多维数组中的单元,其索引从零开始,每一维包含了size个元素。

    如果size小于1,会抛出一个E_WARNING错误并返回NULL

    【示例】

    <?php
    echo "<pre>";
    $input_array = array('a'=>array('x', 'y'), 'b', 'c', 'd', 'e');
    print_r(array_chunk($input_array, 2));
    // 设置$preserve_keys的值为true,保留原来的键名
    print_r(array_chunk($input_array, 2, true));
    ?>
    

    程序输出结果:

    在这里插入图片描述

  2. array_merge()函数
    该函数可以合并一个或多个数组。
    说明:


    array_merge(array $array1[, $array $...]):array
    

    array_merge()将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将***不会***覆盖原来的值,而是附加到后面。如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。

    参数:


    • array1
      要合并的第一个数组。

    • 要合并的数组列表。

    返回值:


    返回结果数组。

    【示例】

    
    

    程序输出结果:

    在这里插入图片描述

    如果想完全保留原有数组并只想将新的数组附加到后面,就用“+”运算符。使用“+”运算符连接数组,连接的数组中键名相同时第一个数组的键值对将会保留,后面的将被舍弃。

    【示例】

    <?php
    $array1 = array(0=>'zero_a', 2=>'two_a', 3=>'three_a');
    $array2 = array(1=>'one_b', 3=>'three_b', 4=>'four_b');
    $result = $array1 + $array2;
    var_dump($result);
    ?>
    

    程序输出结果:

    在这里插入图片描述

增加/删除数组中的元素

  1. array_unshift()函数
    该函数可在数组开头插入一个或多个单元。
    说明:


    array_unshift(array &$array[, mixed $...]):int
    

    array_unshift()将传入的单元插入到 array 数组的开头。注意单元是作为整体被插入的,因此传入单元将保持同样的顺序。所有的数值键名将修改为从零开始重新计数,所有的字符串键名保持不变。

    参数:


    • array
      输入的数组

    • 插入的变量

    返回值:


    返回array数组新的单元数目。

    【示例】

    <?php
    $queue = array('a'=>'orange', 1=>'banana');
    array_unshift($queue, "apple", "raspbery");
    print_r($queue);
    ?>
    

    程序输出结果:

    在这里插入图片描述

    可以看到原始数组中键值为1的单元,此时键值已经发生了改变。

  2. array_shift()函数
    该函数可以将数组开头的单元移出数组。
    说明:


    array_shift(array &$array):mixed
    

    array_shift()array 的第一个单元移出并作为结果返回,将array 的长度减一并将所有其它单元向前移动一位。所有的数字键名将改为从零开始计数,字符串键名将不变。

    使用此函数后会重置(reset())array指针。

    参数:


    • array
      输入的数组。

    返回值:


    返回移出的值,如果array为空或不是一个数组则返回NULL。

    【示例】

    <?php
    $stack = array("orange", "banana", "apple", "raspberry");
    $fruit = array_shift($stack);
    print_r($stack);
    ?>
    

    程序输出结果:

    在这里插入图片描述
    从输出结果可以看到orange被移出了数组,并且数组的键名发生了改变。

  3. array_push()函数
    该函数用来将一个或多个单元压入数组的末尾(入栈)。
    说明:


    array_push(array &$array, mixed $value1[, mixed $...]):int
    

    array_push()array 当成一个栈,并将传入的变量压入array 的末尾。array的长度将根据入栈变量的数目增加。

    如果用array_push()来个数组增加一个单元,不如使用$array[]=$val的方式,因为这样没有调用函数的额外负担。如果第一个参数不是数组,该函数会发出一条警告。这和$var[]的行为不同,后者会新建一个数组。

    参数:


    • array
      输入的数组。
    • value1
      要压入数组末尾的第一个值。

    返回值:


    返回处理之后数组的元素个数。

    【示例】

    <?php
    $stack = array("orange", "banana");
    $fruit = array_push($stack, "apple", "raspberry");
    print_r($stack);
    ?>
    

    程序输出结果:

    在这里插入图片描述

  4. array_pop()函数
    该函数可将数组的最后一个单元弹出(出栈)。
    说明:


    array_pop(array &$array):mixed
    

    array_pop()弹出并返回array 数组的最后一个单元,并将数组array 的长度减一。

    参数:


    • array
      需要弹出栈的数组。

    返回值:


    返回array的最后一个值,如果array为空(如果不是一个数组),将会返回NULL

    【示例】

    <?php
    $stack = array("orange", "banana", "apple", "raspberry");
    $fruit = array_pop($stack);
    print_r($stack);
    ?>
    

    程序输出结果:

    在这里插入图片描述

其他常用数组函数

  1. array_slice()函数
    该函数从数组中取出一段。
    说明:


    array_slice(array $array, int $offset[, int $length = NULL[, bool $preserve_keys = false]]):array
    

    array_slice()返回根据 offsetlength 参数所指定的 array 数组中的一段序列。

    参数:


    • array
      输入的数组。
    • offset
      如果该值为非负,则序列将从数组中的此偏移量开始。如果该值为负,则序列将从数组中距离末端这么远的地方开始。
    • length
      如果给出了length并且为正,则序列中将具有这么多的单元。如果给出了length并且为负,则序列将终止在距离数组末端这么远的地方。如果省略,则序列将从offset开始一直到array的末端。
    • preserve_keys
      array_slice()默认会重新排序并重置数组的数字索引。可以通过将preserve_keys设为TRUE来改变此行为。

    返回值:


    返回其中一段。如果offset参数大于array尺寸,就会返回空的array

    【示例】

    <?php
    echo "<pre>";
    $input = array("a", "b", "c", "d", "e");
    $output = array_slice($input, 2);  // 返回"c","d"和"e"
    $output = array_slice($input, -2, 1);  // 返回"d"
    $output = array_slice($input, 0, 3);  // 返回"a","b"和"c"
    // 注意一下两个返回数组的键名
    print_r(array_slice($input, 2, -1));
    print_r(array_slice($input, 2, -1, true));
    ?>
    

    程序输出结果:

    在这里插入图片描述

  2. array_splice()函数
    该函数可以把数组的一部分去掉并用其他值取代。
    说明:


    array_splice(array &$input, int $offset[, int $length = count($input)[, mixed $replacement = array()]]):array
    

    input数组中由offsetlength指定的单元去掉,如果提供了replacement参数,则用其中的单元取代。**input**中的数字键名将不被保留。如果replacement不是数组,会被类型转换成数组。当传入的replacement是个对象或者NULL,会导致未知行为出现。

    参数:


    • input
      输入的数组。
    • offset
      如果offset为正,则从input数组中该值指定的偏移量开始移除。如果offset为负,则从input末尾到该数值指定的偏移量开始移除。
    • length
      如果省略了length,则移除数组中从offset到结尾的所有部分。如果指定了length并且为正值,则移除length个单元。如果length为负值,则移除从offset到数组末尾倒数length为止中间所有的单元。如果length为零,不会移除单元。小窍门:当给出了replacement时要移除从offset到数组末尾所有单元时,用count($input)作为length
    • replacement
      如果给出了replacement数组,则被移除的单元被此数组中的单元替代。如果offsetlength的组合结果是不会移除任何值,则replacement数组中的单元将被插入到offset指定的位置。注意替换数组中的键名不保留。如果用来替换replacement只有一个单元,那么不需要给它加上array(),除非该单元本身就是一个数组,一个对象或者NULL

    返回值:


    返回一个包含有被移除单元的数组。

    【示例】

    <?php
    echo "<pre>";
    $input = array("red", "green", "blue", "yellow");
    array_splice($input, 2);
    print_r($input);
    // $input现在是array("red", "green")
    
    $input = array("red", "green", "blue", "yellow");
    array_splice($input, 1, -1);
    print_r($input);
    // $input现在是array("red", "yellow");
    
    $input = array("red", "green", "blue", "yellow");
    array_splice($input, 1, count($input), "orange");
    print_r($input);
    // $input现在是array("red", "orange");
    
    $input = array("red", "green", "blue", "yellow");
    array_splice($input, -1, 1, array("black", "maroon"));
    print_r($input);
    // $input现在是array("red", "green", "blue", "black", "maroon")
    
    $input = array("red", "green", "blue", "yellow");
    array_splice($input, 3, 0, "purple");
    print_r($input);
    // $input现在是array("red", "green", "blue", "purple", "yellow")
    ?>
    

    程序输出结果:

    在这里插入图片描述

  3. is_array()函数
    该函数检测变量是否为数组。
    说明:


    is_array(mixed $var):bool
    

    如果var是数组,则返回TRUE,否则返回FALSE
    【示例】略

  4. array_sum()函数
    该函数计算数组中所有值的和。
    说明:


    array_sum(array $array):number
    

    array_sum()将数组中所有值的和以整数或浮点数的结果返回。array_sum()计算数组元素的和时,普通字符串被当做0,而数字类型字符串会转换成相应整型或浮点型参与计算。
    参数:


    • array
      输入的数组。

    返回值:


    所有值的和以整型或浮点型的结果返回,array为空则返回0。

    【示例】

    <?php
    $a = array('b', 2, 4,'2', 6, 8);
    echo "sum(a) = " . array_sum($a) . "<br />";
    $b = array("a"=>1.2, "b"=>2.3, "c"=>3.4);
    echo "sum(b) = " . array_sum($b) . "<br />";
    ?>
    

    程序输出结果:

    在这里插入图片描述

    可以看出$a中第一个单元’b’被转换为了0,而第四个单元’2’被转换成了整数2。

  5. array_product()函数
    该函数用来计算数组中所有值的乘积并返回。函数的用法同array_sum()类似,此处不再累述。

  6. array_flip()函数
    该函数用来交换数组中的键和值。
    说明:


    array_flip(array $array):array
    

    array_flip()返回一个反转后的array,例如array 中的键名变成了值,而 array 中的值成了键名。注意 array 中的值需要能够作为合法的键名(例如需要是integer或者string)。如果类型不对,将出现一个警告,并且有问题的键/值对将不会出现在结果里。如果同一个值出现多次,则最后一个键名将作为它的值,其它键会被丢弃。

    参数:


    • array
      要交换键/值对的数组。

    返回值:


    成功时返回交换后的数组,如果失败返回NULL

    【示例】

    <?php
    $input = array("oranges", "apples", "pears");
    $flipped = array_flip($input);
    
    print_r($flipped);
    ?>
    

    程序输出结果:

    在这里插入图片描述

    【示例2】

    <?php
    $input = array("a"=>1, "b"=>1, "c"=>2);
    $flipped = array_flip($input);
    
    print_r($flipped);
    ?>
    

    程序输出结果:

    在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章