6.3 数组操作
本节介绍操作数组的一些函数方法,掌握这些操作方法能够灵活地处理数组。
6.3.1 检查数组中是否存在某个值
PHP中可使用in_array()函数判断数组中是否存在某个值,语法如下:
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
说明:在haystack中搜索needle,如果没有设置strict,就使用宽松的比较。如果strict的值为true,则in_array()函数还会检查needle的类型是否和haystack中的相同。此函数的返回值为true或false。
注意,in_array()函数只能在当前维度数组中检查是否存在某个元素。请看如下示例:
<? 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()只做了一级检查,只在当前维度检查是否包含相应元素,而不会递归到数组中的每个元素。
上述代码的运行结果为:
bool(false) bool(true)
6.3.2 数组转换为字符串
使用implode()函数可将一个一维数组转化为字符串。语法如下:
string implode ( string $glue , array $pieces )
说明:该函数返回一个由glue分割后的数组的值组成的字符串。
使用示例如下:
<? php $array=array('lastname','email','phone'); //声明数组 $comma_separated=implode(", ",$array); //分割数组 echo $comma_separated; //输出结果 ?>
运行以上代码的结果为:
lastname, email, phone
6.3.3 计算数组中的单元数目
使用count()函数可计算数组中的单元数目,count()函数还可以计算对象中的属性个数。语法如下:
int count ( mixed $var [, int $mode = COUNT_NORMAL ] )
说明:如果可选的mode参数设为COUNT_RECURSIVE(或1), count()将递归地对数组计数,对计算多维数组的所有单元尤其有用。mode的默认值是0。注意,count()识别不了无限递归。
该函数示例如下:
<? php $food=array('fruits'=>array('orange','banana','apple'), 'veggie'=>array('carrot','collard','pea')); echo count($food, 1);//结果为8 echo count($food); // 结果为 2 ?>
6.3.4 数组当前单元和数组指针
使用current()函数可返回数组的当前单元,语法如下:
mixed current ( array &$array )
说明:每个数组中都有一个内部指针指向它“当前的”单元,该指针初始指向插入到数组中的第一个单元。
示例如下:
<? php $food= array('orange','banana','apple'); var_dump(current($food)); //输出orange ?>
默认数组内部指针开始指向头部,所以此处输出结果为:
orange
下面介绍4个可以移动数组内部指针的函数。
●end():将数组的内部指针指向最后一个单元并返回其值。
● prev():将数组的内部指针倒回一位,返回内部指针指向前一个单元的值,当没有更多单元时返回false。
● reset():将数组的内部指针指向第一个单元并返回第一个数组单元的值。
● next():将数组中的内部指针向前移动一位,返回数组内部指针指向的下一个单元的值,当没有更多单元时返回False。
关于数组指针操作的示例如下:
<? php $food= array('orange','banana','apple'); //声明数组 echo next($food) . "<br/>"; //将数组内部指针向前移动一位 echo current($food) . "<br/>"; //输出当前数组指针指向的单元值 echo prev($food) . "<br/>"; //将数组指针倒回一位 echo end($food) . "<br/>"; //将数组指针指向最后一个单元 echo reset($food) . "<br/>"; //将数组指针指向第一个单元 ?>
执行以上程序的输出结果为:
banana banana orange apple orange
6.3.5 数组中的键名和值
1.从关联数组中取得键名
使用key()函数可从关联数组中返回键名,语法如下:
mixed key ( array &$array )
说明:key()函数返回数组中内部指针指向的当前单元的键名,但它不会移动指针。如果内部指针超过了元素列表尾部,或者数组是空的,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); // 将数组指针向前移动一位 } ?>
执行以上程序的结果为:
fruit1 fruit2 fruit3 fruit4 fruit5
2.检查给定键名或索引是否存在于数组中
PHP中使用array_key_exists()函数检查给定键名或索引是否存在于数组中。语法如下:
bool array_key_exists ( mixed $key , array $search )
说明:array_key_exists()在给定的key存在于数组中时返回true, key可以是任何能作为数组索引的值。array_key_exists()也可用于对象。
该函数的使用示例如下:
<? php $search_array=array('first'=>1,'second'=>4); if (array_key_exists('first',$search_array)){ //检测数组中是否存在键first echo "The'first'element is in the array"; } ?>
执行结果为:
The 'first' element is in the array
3.获取数组中部分或所有的键名
使用array_keys()函数可获得数组中部分或所有键名,语法如下:
array array_keys ( array $array [, mixed $search_value [, bool $strict = false ]] )
说明:array_keys()返回数组的键名。如果指定了可选参数search_value,就只返回值为search_value的键名,否则数组中的所有键名都会被返回。strict设置为true时判断在搜索的时候使用严格的比较(= = =)。
该函数的使用示例如下:
<? 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)); //只返回当前维度的数组的键 ?>
执行上述代码的结果如下:
Array ( [0] => 0 [1] => color ) Array ( [0] => 0 [1] => 3 [2] => 4 ) Array ( [0] => color [1] => size )
4.获取数组中所有的值
使用array_values()函数可获得数组中所有的值,语法如下:
array array_values ( array $input )
说明:array_values() 返回数组中所有的值并为其建立数字索引。
该函数的使用示例如下:
<? php $array=array("blue", "red", "green"); echo "<pre>"; print_r(array_values($array));//返回数组$array中所有的值 ?>
以上代码的执行结果为:
Array ( [0] => blue [1] => red [2] => green )
5.搜索给定值返回键名
使用array_search()函数可以在数组中搜索给定的值,如果成功就返回相应的键名。语法如下:
mixed array_search ( mixed $needle , array $haystack [, bool $strict = false ] )
说明:如果在haystack中搜索到了needle,就返回它的键,否则返回false。如果needle在haystack中不止一次出现,就返回第一个匹配的键。要返回所有匹配值的键,应该用array_keys()加上可选参数search_value来代替。如果可选参数strict为true,那么array_search()将在haystack中检查完全相同的元素。这意味着同样检查haystack里needle的类型,并且对象须是同一个实例。
该函数的使用示例如下:
<? 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; ?>
6.3.6 填补数组
1. array_pad()
array_pad()函数可用值将数组填补到指定长度,其语法如下:
array array_pad ( array $input , int $pad_size , mixed $pad_value )
说明:array_pad()返回数组的一个备份,并用pad_value将其填补到pad_size指定的长度。如果pad_size为正,就填补到数组的右侧,若为负则从左侧开始填补。如果pad_size的绝对值小于或等于input数组的长度就没有任何填补。一次最多可以填补1048576个单元。
使用示例如下:
<?php $input = array(12, 10, 9); echo "<pre>"; $result=array_pad($input, 5, 0); //从数组右侧开始,用0填补数组到含有5个元素 print_r($result); $result=array_pad($input,-7,-1); //从数组左侧开始,用-1填补数组到含有7个元素 print_r($result); $result=array_pad($input, 2, "noop"); //第二个参数小于数组长度,不填补 print_r($result); ?>
运行以上程序的输出结果如下:
Array ( [0] => 12 [1] => 10
[2] => 9 [3] => 0 [4] => 0 ) Array ( [0] => -1 [1] => -1 [2] => -1 [3] => -1 [4] => 12 [5] => 10 [6] => 9 ) Array ( [0] => 12 [1] => 10 [2] => 9 )
2. array_fill()
array_fill()函数可以用给定的值填充数组。语法如下:
array array_fill ( int$start_index , int$num , mixed$value )
说明:array_fill()用value参数的值将一个数组填充num个条目,start_index是整型数据。若start_index为非负整数,数组的键由start_index, start_index+1, start_index+2, start_index+3…组成,直到start_index+num-1结束。若start_index为负整数,则数组的键由start_index,0,1,2, …, num-1组成。该函数返回填充后的数组。
使用示例如下:
<?php $a=array_fill(5, 6,'banana'); //使用banana填充数组到6个元素,索引键由数字5开始 $b=array_fill(-2, 4,'pear'); //使用pear填充数组到4个元素,索引键由-2开始 $c=array_fill(3,2,array('green','red','blue')); //用一个数组填充成一个二维数组 echo "<pre>"; print_r($a); print_r($b); print_r($c); ?>
执行以上程序的输出结果如下:
Array ( [5] => banana [6] => banana [7] => banana [8] => banana [9] => banana [10] => banana ) Array ( [-2] => pear [0] => pear [1] => pear [2] => pear ) Array ( [3] => Array ( [0] => green [1] => red [2] => blue ) [4] => Array ( [0] => green [1] => red [2] => blue ) )
3. array_fill_keys()
array_fill_keys()函数使用指定的键和值填充数组。语法如下:
array array_fill_keys ( array $keys , mixed $value )
说明:使用value参数的值作为值,使用keys数组的值作为键来填充一个数组,返回填充后的数组。
使用示例如下:
<? php $keys = array('foo', 5, 10, 'bar'); $a=array_fill_keys($keys,'banana'); //使用$keys数组的值作为键,banana作为值重新组建一个数组 $b=array_fill_keys($keys, array('red', 'green', 'blue')); //使用$keys的值作为键,另一个数组为元素,组成一个新的二维数组 echo "<pre>"; print_r($a); print_r($b); ?>
执行以上程序的输出结果为:
Array ( [foo] => banana [5] => banana [10] => banana [bar] => banana ) Array ( [foo] => Array ( [0] => red [1] => green [2] => blue ) [5] => Array ( [0] => red [1] => green [2] => blue ) [10] => Array ( [0] => red [1] => green [2] => blue ) [bar] => Array ( [0] => red [1] => green [2] => blue ) )
6.3.7 从数组中随机取出一个或多个单元
array_rand()函数可从数组中取出一个或多个随机的单元,并返回随机条目的一个或多个键。语法如下:
mixed array_rand ( array $input [, int $num_req = 1 ] )
说明:input是输入的数组,num_req指明需要输出多少个单元。如果指定的数目超过数组里的数量,将会产生一个E_WARNING级别的错误。如果只取出一个,那么array_rand()将返回一个随机单元的键名,否则返回一个包含随机键名的数组。这样就可以随机从数组中取出键名和值。
该函数的使用示例如下:
<? php $input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank"); $rand_keys=array_rand($input, 2); //从$input数组中随机取出两个单元,组成一个新的数组返回 echo "<pre>"; print_r($rand_keys); ?>
上述代码的运行结果如下:
Array ( [0]=>1 [1]=>3 )
6.3.8 数组排序与打乱数组
本小节介绍几个适用于数组排序和打乱数组的函数。
1. sort()
sort()函数可实现对数组的排序,语法如下:
bool sort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
说明:本函数对数组进行排序。当本函数结束时,数组单元从最低到最高重新安排,成功时返回true,失败时返回false。array是要排序的数组,sort_flags是可选的参数,具体值如下:
● SORT_REGULAR正常比较单元(不改变类型)。
● SORT_NUMERIC单元被作为数字来比较。
● SORT_STRING单元被作为字符串来比较。
● SORT_LOCALE_STRING根据当前的区域(locale)设置来把单元当作字符串比较,可以用setlocale() 来改变。
●SORT_NATURAL和natsort()类似,对每个单元以“自然的顺序”对字符串进行排序,是PHP 5.4.0中新增的一个参数。
●SORT_FLAG_CASE能够与SORT_STRING或SORT_NATURAL合并(“或”位运算),不区分大小写排序字符串。
该函数的使用示例如下:
<? php $fruits = array("lemon", "orange", "banana", "apple"); sort($fruits); // 数组排序 echo "<pre>"; print_r($fruits); ?>
运行以上程序的输出结果为:
Array ( [0] => apple [1] => banana [2] => lemon [3] => orange )
2. asort()
asort()函数对数组进行排序并保持索引关系。语法如下:
bool asort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
说明:本函数对数组进行排序,数组的索引保持和单元的关联,主要用于对那些单元顺序很重要的结合数组进行排序。其中,array是输入的数组,sort_flags可选参数和sort()函数一致。同样,排序成功时返回true,失败时返回false。
该函数的使用示例如下:
<? php $fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple"); asort($fruits);// 数组排序 echo "<pre>"; print_r($fruits); ?>
执行以上程序的结果如下:
Array ( [c] => apple [b] => banana
[d] => lemon [a] => orange )
可见fruits按照字母顺序排序,并且单元的索引关系不变。
3. arsort()
arsort()函数对数组进行逆向排序并保持索引关系。语法如下:
bool arsort ( array &$array [, int $sort_flags = SORT_REGULAR ] )
说明:其参数和返回值与asort()函数相似。
该函数的使用示例如下:
<? php $fruits=array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple"); arsort($fruits);// 对数组逆向排序 echo "<pre>"; print_r($fruits); ?>
执行结果如下:
Array ( [a] => orange [d] => lemon [b] => banana [c] => apple )
可见arsort()函数对数组排序后的结果与asort()恰好相反。
4. rsort()
rsort()函数对数组进行逆向排序,但是不保持索引关系。语法如下:
bool rsort ( array&$array [, int$sort_flags=SORT_REGULAR ] )
说明:参数和返回值说明与sort()相同。
该函数的使用示例如下:
<? php $fruits=array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple"); rsort($fruits);// 对数组逆向排序,不保持索引关系 echo "<pre>"; print_r($fruits); ?>
运行以上程序的结果如下:
Array ( [0] => orange [1] => lemon [2] => banana [3] => apple )
可见rsort()对数组进行了重新排序,并且建立了新的索引关系。
5. shuffle()
shuffle()函数将数组打乱。语法如下:
bool shuffle ( array &$array )
说明:成功时返回true,失败时返回false。
该函数的使用示例如下:
<? php $numbers=range(1, 20); shuffle($numbers); // 打乱数组顺序 foreach ($numbers as$number){ echo "$number "; } ?>
执行以上程序的结果为:
2 16 12 17 5 14 1 20 9 4 18 3 13 15 11 7 8 6 10 19
每次执行都会打乱数组,执行结果会有所不同。
6.3.9 遍历数组
编程中常用for、foreach、each、list对数组进行遍历。
1. for循环遍历数组
使用for循环遍历数组的一个例子如下:
<? php $fruits=array("lemon", "orange", "banana", "apple"); for ($i=0;$i<count($fruits);$i++){ echo current($fruits) . "\n"; echo$fruits[$i] . "<br/>"; }? >
以上程序的执行结果如下:
lemon lemon lemon orange lemon banana lemon apple
从结果可知,这种使用for循环遍历数组的形式没有改变数组的内部指针。
2. foreach遍历数组
示例如下:
<? php $array=[0, 1, 2]; foreach ($array as&$val) // 遍历数组 { echo$val; } ?>
运行以上程序的输出结果为:012。
再给出一个示例:
<? php $array=[0, 1, 2]; foreach ($array as&$val) { var_dump(current($array)); // 遍历数组,使用current()输出数组指针指向的当前单元的值 } ?>
在PHP 7中,运行以上程序的输出结果为:int(0) int(0) int(0)。在之前的版本中则会输出:int(1) int(2)和bool(false)。
在使用foreach循环遍历数组的时候,foreach是对数组的备份进行操作,在循环内部修改数组不会对循环之外访问数组有影响。示例如下:
<? php $array=[0, 1, 2]; foreach ($array as$val) { $val=$val*2;// 元素值乘以2 } var_dump($array); ?>
运行程序,输出结果是:
array(3) { [0]=> int(0) [1]=> int(1) [2]=> int(2) }
如果是按照引用循环,那么在循环内部对数组做的修改会影响数组本身。示例如下:
<? php $array=[0, 1, 2]; foreach ($array as&$val) //&的存在表示引用数组元素,类似函数参数的引用传递 { $val=$val*2; } var_dump($array); ?>
运行以上程序的结果为:
array(3) { [0]=> int(0) [1]=> int(2) [2]=> &int(4) }
3. each()和list()
each()函数返回数组中当前的键值并将数组指针向前移动。在执行each()之后,数组指针将停留在数组中的下一个单元或者当碰到数组结尾时停留在最后一个单元。如果要再用each遍历数组,就必须使用reset()。
each()的使用示例如下:
<? 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); ?>
执行以上程序的结果如下:
Array ( [1]=>bob [value]=>bob [0]=>0 [key]=>0 ) fred Array ( [1]=>fred [value]=>fred [0]=>1 [key]=>1 ) jussi
each()函数和list()函数结合可以遍历数组,示例如下:
<? php $fruit=array('a'=>'apple','b'=>'banana','c'=>'cranberry'); while (list($key,$val)=each($fruit)){ echo "$key=>$val\n"; } ?>
执行以上程序的结果为:
a => apple b => banana c => cranberry
也可以使用list()将数组的值分别赋给变量,示例如下:
<? php $info=array('coffee','brown','caffeine'); // 列出所有变量 list($drink,$color,$power)=$info; echo$drink . "\n" .$color . "\n" .$power; ?>
执行以上程序的输出结果为:
coffee brown caffeine
注意以下例子:
<? php $info=array('coffee','brown','caffeine'); list($a[0],$a[1],$a[2])=$info; var_dump($a); ?>
在PHP 7中执行以上程序,输出结果为:
array(3) { [0]=> string(6) "coffee" [1]=> string(5) "brown" [2]=> string(8)"caffeine" }
在PHP 5中的输出结果是:
array(3) { [0]=> string(6) "caffeine" [1]=> string(5) "brown" [2]=> string(8)"coffee" }
PHP 7改变了list()赋值的顺序,由原来的倒序赋值改成了正序赋值。
6.3.10 数组的拆分与合并
1. array_chunk()
array_chunk()函数可将一个数组分割成多个。语法如下:
array array_chunk ( array $input , int $size [, bool $preserve_keys = false ] )
说明:此函数将input数组分割成多个数组,返回一个多维数组,其中每个数组的单元数目由size决定。最后一个数组的单元数目可能会少于size个。可选参数preserve_keys设为true,可以使PHP保留输入数组中原来的键名。若指定了false,则每个结果数组将用从零开始的新数字索引。默认值是false。
该函数的使用示例如下:
<? php echo "<pre>"; $input_array = array('a'=>array('x', 'y'), 'b', 'c', 'd', 'e'); print_r(array_chunk($input_array, 2)); print_r(array_chunk($input_array, 2, true)); //设置参数为true,保留原来的键名 ?>
执行以上程序的输出结果如下:
Array ( [0] => Array ( [0] => Array ( [0] => x [1] => y ) [1] => b ) [1] => Array ( [0] => c [1] => d ) [2] => Array ( [0] => e ) )
Array ( [0] => Array ( [a] => Array ( [0] => x [1] => y ) [0] => b ) [1] => Array ( [1] => c [2] => d ) [2] => Array ( [3] => e ) )
2. array_merge()
array_merge()函数可合并一个或多个数组,语法如下:
array array_merge ( array $array1 [, array $... ] )
说明:array_merge()将一个或多个数组单元合并起来,一个数组中的值附加在前一个数组的后面,返回作为结果的数组。
如果输入的数组中有相同的字符串键名,那么该键名后面的值将覆盖前一个值。如果数组包含数字键名,那么后面的值将不会覆盖原来的值,而是附加到后面。
如果只给了一个数组并且该数组是数字索引的,那么键名会以连续方式重新索引。
该函数的使用示例如下:
<? php $array1 = array("color" => "red", 2, 4); $array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4); $result=array_merge($array1,$array2); // 合并数组 print_r($result); ?>
执行以上程序的结果为:
Array ( [color] => green [0] => 2 [1] => 4 [2] => a [3] => b [shape] => trapezoid[4] => 4 )
如果想完全保留原有数组并只想将新的数组附加到后面,就用“+”运算符。使用“+”连接数组,连接的数组中键名相同时第一个数组的键值对将会保留,后面的将会被舍弃。示例如下:
<? 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); ?>
执行以上程序的输出结果为:
array(5) { [0]=> string(6) "zero_a" [2]=> string(5) "two_a" [3]=> string(7)"three_a" [1]=> string(5) "one_b" [4]=> string(6) "four_b" }
6.3.11 增加/删除数组中的元素
1. array_unshift()
array_unshift()函数可在数组开头插入一个或多个单元,语法如下:
int array_unshift ( array &$array , mixed $var [, mixed $... ] )
说明:array_unshift()将传入的单元插入array数组的开头。注意,单元是作为整体被插入的,因此传入单元将保持同样的顺序。所有的数值键名将修改为从零开始重新计数,所有的文字键名保持不变。
该函数的使用示例如下:
<? php $queue = array('a'=>"orange", 1=>"banana"); array_unshift($queue, "apple", "raspberry");// 在数组头部增加元素 print_r($queue); ?>
执行以上程序的结果为:
Array ( [0] => apple [1] => raspberry [a] => orange [2] => banana )
2. array_shift()
array_shift()函数可将数组开头的单元移出数组,语法如下:
mixed array_shift ( array &$array )
说明:array_shift()将array的第一个单元移出并作为结果返回,将array的长度减一并将所有其他单元向前移动一位。所有的数字键名将改为从零开始计数,文字键名保持不变。
该函数的使用示例如下:
<? php $stack = array("orange", 'b'=>"banana", "apple", "raspberry"); $fruit = array_shift($stack); //移除数组的第一个单元并返回 print_r($stack); ?>
执行以上程序的结果为:
Array ( [b] => banana [0] => apple [1] => raspberry )。
3. array_push()
array_push()函数用来将一个或多个单元压入数组的末尾(入栈)。语法如下:
int array_push ( array &$array , mixed $var [, mixed $... ] )
说明:array_push()将array当成一个栈,并将传入的变量压入array的末尾。array的长度将根据入栈变量的数目增加。该函数返回处理之后数组的元素个数。使用示例如下:
<? php $stack = array("orange", 'b'=>"banana"); echo array_push($stack, "apple", "raspberry");// 将元素apple, raspberry压入数组 print_r($stack); ?>
执行以上程序的输出结果为:
4 Array ( [0] => orange [b] => banana [1] => apple [2] => raspberry )
4. array_pop()
array_pop()函数可将数组的最后一个单元弹出(出栈),语法如下:
mixed array_pop ( array &$array )
说明:array_pop()弹出并返回array数组的最后一个单元,并将数组array的长度减一。如果array为空(或者不是数组)就将返回NULL。此外,如果被调用的不是一个数就会产生一个Warning。示例如下:
<? php $stack = array("orange", "banana", "apple", "raspberry"); echo$fruit=array_pop($stack);// 弹出数组最后一个单元 print_r($stack); ?>
执行以上程序的输出结果为:
raspberry Array ( [0] => orange [1] => banana [2] => apple )。
6.3.12 其他常用数组函数
除了前面介绍的数组函数外,还有其他一些常用数组函数。
1. array_slice()
array_slice()可以从数组中取出一段,语法如下:
array array_slice ( array $array , int $offset [, int $length = NULL [, bool $preserve_keys = false ]] )
说明:array_slice()返回根据offset和length参数所指定的array数组中的一段序列。如果offset非负,那么序列将从array中的此偏移量开始。如果offset为负,那么序列将从array中距离末端这么远的地方开始。如果给出了length并且为正,那么序列中将具有这么多的单元。如果给出了length并且为负,那么序列将终止在距离数组末端这么远的地方。如果省略,那么序列将从offset开始一直到array的末端。array_slice()默认会重新排序并重置数组的数字索引,可以通过将preserve_keys设为true来改变此行为。
该函数的使用示例如下:
<? php echo "<pre>"; $input = array("a", "b", "c", "d", "e"); $output=array_slice($input, 2); //returns "c", "d", and "e" $output=array_slice($input,-2, 1); //returns "d" $output=array_slice($input, 0, 3); //returns "a", "b", and "c" // 注意以下两个返回数组的键名 print_r(array_slice($input, 2, -1)); print_r(array_slice($input, 2, -1, true)); ?>
执行以上程序的输出结果为:
Array ( [0] => c [1] => d ) Array ( [2] => c [3] => d )
2. array_splice()array_splice()函数可以把数组中的一部分去掉并用其他值取代。语法如下:
array array_splice ( array &$input , int $offset [, int $length = 0 [, mixed $replacement ]] )
说明:array_splice()把input数组中由offset和length指定的单元去掉,返回一个包含有被移除单元的数组。如果提供了replacement参数,就用其中的单元取代。input中的数字键名不会保留。如果offset为正,就从input数组中该值指定的偏移量开始移除。如果offset为负,就从input末尾倒数该值指定的偏移量开始移除。如果省略length,就移除数组中从offset到结尾的所有部分。如果指定了length并且为正值,就移除这么多单元。如果指定了length并且为负值,就移除从offset到数组末尾倒数length为止中间所有的单元。如果给出了replacement数组,那么被移除的单元将被此数组中的单元替代。
如果offset和length的组合结果是不会移除任何值,那么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 is now array("red", "green", // "blue", "purple", "yellow"); ?>
执行以上程序的输出结果如下:
Array ( [0] => red [1] => green ) Array ( [0] => red [1] => yellow ) Array ( [0] => red [1] => orange ) Array ( [0] => red [1] => green [2] => blue [3] => black [4] => maroon ) Array ( [0] => red [1] => green [2] => blue [3] => purple [4] => yellow )
3. is_array()
is_array()函数检测变量是否为数组。语法如下:
bool is_array ( mixed $var )
说明:如果var是array,就返回true,否则返回false。此函数与is_float()、is_int()、is_integer()、is_string()和is_object()功能类似。
该函数的使用示例如下:
<? php $a = [1,2,3]; $b = 'b'; var_dump(is_array($a)); var_dump(is_array($b)); ?>
执行以上程序的结果为:
bool(true) bool(false)
4. array_sum()
array_sum()函数可计算数组中所有值的和,语法如下:
number array_sum ( array $array )
说明:array_sum() 将数组中所有值的和以整数或浮点数的结果返回。
使用示例如下:
<? php $a = ['b',2,3, 'a',3, '2']; echo array_sum($a); ?>
执行以上程序的结果为:
10
array_sum()计算数组元素的和时,普通字符串被当作0,而数字类型的字符串将会转换成相应整型或浮点型数据参与计算。
5. array_product()
array_product()函数用来计算数组中所有值的成绩并返回。语法如下:
number array_product ( array $array )
该函数的使用示例如下:
<? php $a = ['b',2,3, 'a',3, '2']; echo array_product($a) . "\n"; $b = ['2',3,4]; echo array_product($b); ?>
执行以上程序的结果为:
0 24
array_product()计算数组元素乘积时,如果其中有普通字符串,那么计算结果为0,数字类型的字符串将会被转换成对应数字数值参与计算。
6. array_flip()
array_flip()函数用来交换数组中的键和值。语法如下:
array array_flip ( array $trans )
说明:trans中的值需要能够作为合法的键名,例如需要是integer或者string。如果值的类型不对将发出一个警告,并且有问题的键-值对将不会反转。如果同一个值出现了多次,那么最后一个键名将作为它的值,所有其他的都丢失了。执行成功时返回交换后的数组,失败时返回NULL。
该函数的使用示例如下:
<? php echo "<pre>"; $trans = array("a" => 1, "b" => 1, "c" => 2); $trans=array_flip($trans); // 交换数组中的键和值 print_r($trans); $trans = ['a', 'b', '1',2,3]; print_r(array_flip($trans)); ?>
执行以上程序的结果如下:
Array ( [1] => b [2] => c ) Array ( [a] => 0 [b] => 1 [1] => 2 [2] => 3 [3] => 4 )