PHP对数组的常用处理
print_r()
利用 print_r() 函数可以打印输出整个数组内容及结构,按照一定格式显示键和元素。注意 print_r() 函数不仅是只用于打印,实际它是用于打印关于变量的易于理解的信息。
var_dump()
同 print_r() 函数一样,var_dump() 函数也可以用于打印数组的数据及结构。不过 var_dump() 函数功能比 print_r() 更强大,可以同时打印多个变量且给出变量的类型信息。
<?php
$arr_age = array(18, 20, 25);
var_dump($arr_age);
?>
输出
array(3) {
[0]=>
int(18)
[1]=>
int(20)
[2]=>
int(25)
}
print_r() 和 var_dump() 函数一般是用于调试程序使用,更多情况是使用 echo 来输出具体的数组单元值。
is_array()
PHP is_array() 函数用于检测变量是否是数组,这个函数尤其会用于一些安全性检查方面(如表单或 SESSION 检查等)。
foreach()
PHP foreach() 语法结构用于遍历操作或输出数组,foreach() 仅能用于遍历数组或对象,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误。
语法:
foreach (array as $value) statement // 或者: foreach (array as $key => $value) statement
上述语法中,每次循环将当前单元的值赋给 $value 并且数组内部的指针向前移一步。在第二种语法格式中还将当前单元的键名也会在每次循环中赋给变量 $key。
例子:
<?php $arr_age = array("wang"=>18, "li"=>20, "zhang"=>25); foreach ($arr_age as $age) { echo $age,'<br />'; } ?>
运行该例子输出:
18 20 25
延伸预读
PHP 数组是通过哈希表(HashTable)表实现的,因此 foreach 遍历数组时是依据元素添加的先后顺序来进行的。如果想按照索引大小遍历,应该使用 for() 循环遍历。
提示
也可以用 list() 和 each() 结合来遍历数组,但测试发现效率不如 foreach() 。
array_sum()
PHP array_sum() 函数用于计算数组中所有值的和,以整数或浮点数返回计算结果,非数字的单元将视作 0 。
array_product()
PHP array_product() 函数用于计算数组中所有值的乘积,以整数或浮点数返回计算结果,非数字的单元将视作 0 。
array_count_values()
PHP array_count_values() 函数用于统计数组中所有的值出现的次数,返回一个数组,其元素的键名是原数组的值,键值是该值在原数组中出现的次数。
in_array()
PHP in_array() 函数检查数组中是否存在某个值,如果存在则返回 TRUE ,否则返回 FALSE 。
语法:
bool in_array( mixed needle, array array [, bool strict] )
参数 | 说明 |
---|---|
needle | 需要在数组中搜索的值,如果是字符串,则区分大小写 |
array | 需要检索的数组 |
strict | 可选,如果设置为 TRUE ,则还会对 needle 与 array 中的值类型进行检查 |
例子:
<?php $arr_a = array("a", "b", "c", 1); if(in_array("a", $arr_a)){ echo '字符 a 在 $arr_a 数组中存在'; } else { echo '字符 a 在 $arr_a 数组中不存在'; } ?>
例子输出结果如下:
字符 a 在 $arr_a 数组中存在
严格检查的例子:
<?php $arr_a = array("a", "b", "c", 1); if(in_array("1", $arr_a, TRUE)){ echo '字符 1 在 $arr_a 数组中存在'; } else { echo '字符 1 在 $arr_a 数组中不存在'; } ?>
例子输出结果如下:
字符 1 在 $arr_a 数组中不存在
数组作为 needle 的例子:
<?php $arr_a = array(array("a", "b"), 1, 2); $arr_b = array("a", "b"); if(in_array($arr_b, $arr_a)){ echo '数组 $arr_b 在 $arr_a 数组中存在'; } else { echo '数组 $arr_b 在 $arr_a 数组中不存在'; } ?>
例子输出结果如下:
数组 $arr_b 在 $arr_a 数组中存在
array_key_exists()
PHP array_key_exists() 函数用于检查给定的键名或索引是否存在于数组中,如果存在则返回 TRUE ,否则返回 FALSE 。
提示
array_key_exists() 函数对于值为 null 的数组元素仍返回 TRUE。若要对数组元素是否为 null 做检查,请使用 isset()。
array_array()
PHP array_search() 函数用于在数组中搜索给定的值,如果成功则返回相应的键名,否则返回 FALSE 。
语法:
mixed array_search( mixed needle, array array [, bool strict] )
参数 | 说明 |
---|---|
needle | 需要在数组中搜索的值,如果是字符串,则区分大小写 |
array | 需要检索的数组 |
strict | 可选,如果设置为 TRUE ,则还会对 needle 与 array 中的值类型进行检查 |
提示
由于索引数组的起始索引数字可能是 0 ,因此该函数也可能返回与 FALSE 等值的非布尔值,例如 0 或者 "",所以需要使用 === 运算符对函数返回的值进行严格校验。
例子:
<?php $arr_a = array(0 => "a", 1 => "b", 2 => "c"); $key = array_search("a", $arr_a); if( $key !== FALSE ){ echo "键名为:$key"; } else { echo '无匹配结果'; } ?>
例子输出结果如下:
键名为:0
如果 needle 在 array 中出现不止一次,则返回第一个匹配的键。要返回所有匹配值的键,请使用 array_keys() 函数。
参考阅读
in_array() :检查数组中是否存在某个值
- sort() 函数用于对数组单元从低到高进行排序。
- rsort() 函数用于对数组单元从高到低进行排序。
- asort() 函数用于对数组单元从低到高进行排序并保持索引关系。
- arsort() 函数用于对数组单元从高到低进行排序并保持索引关系。
- ksort() 函数用于对数组单元按照键名从低到高进行排序。
- krsort() 函数用于对数组单元按照键名从高到低进行排序。
- natsort() 函数用于对数组使用 自然算法 进行排序。
- natcasesort() 函数用于对数组使用 自然算法 并不区分大小写进行排序。
PHP sort() 函数用于对数组单元从低到高进行排序,如果成功则返回 TRUE,失败则返回 FALSE。
注意:本函数会为排序的数组中的单元赋予新的键名,这将删除原有的键名而不仅是重新排序。
语法:
bool sort( array &array [, int sort_flags] )
可选参数 sort_flags 用于改变排序的行为:
sort_flags 取值 | 说明 |
---|---|
SORT_REGULAR | 正常比较单元 |
SORT_NUMERIC | 单元被作为数字来比较 |
SORT_STRING | 单元被作为字符串来比较 |
SORT_LOCALE_STRING | 根据当前的区域(locale)设置来把单元当作字符串比较 |
例子:
<?php $arr = array("b", "a", "c"); sort($arr); print_r($arr); ?>
运行该例子输出:
Array ( [0] => a [1] => b [2] => c )
在本例中, $arr 数组单元被按照字母顺序排序,而数组单元经过排序后,键值重新分配。
natsort()
PHP natsort() 函数用于对数组使用 自然算法 进行排序,如果成功则返回 TRUE,失败则返回 FALSE。
本函数实现了一个和人们通常对字母数字字符串进行排序的方法一样的排序算法并保持原有键名和值的关联。
语法:
bool natsort ( array &array )
natsort() 和 sort() 排序比较:
<?php $arr1 = $arr2 = array("a1", "a11", "a2"); sort($arr1); print_r($arr1); echo '<br />'; natsort($arr2); print_r($arr2); ?>
运行该例子输出:
Array ( [0] => a1 [1] => a11 [2] => a2 ) Array ( [0] => a1 [2] => a2 [1] => a11 )
natcasesort()
natcasesort() 函数行为与 natsort() 函数完全一致,区别之处在于 natcasesort() 不对数组单元区分大小写。
array_multisort()
PHP array_multisort() 函数用于一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序,如果成功则返回 TRUE,失败则返回 FALSE。
注意:关联(string)键名保持不变,但数字键名会被重新索引。
语法:
bool array_multisort( array1 [, sort_order][, sort_flags][, array2] ... )
array1 为必须参数,需要排序的数组。可选参数 sort_order 和 sort_flags 意义如下:
sort_order 取值 | 说明 |
---|---|
SORT_ASC | 默认值,按照上升顺序排序 |
SORT_DESC | 按照下降顺序排序 |
sort_flags 取值 | 说明 |
---|---|
SORT_REGULAR | 默认值,按照通常方法比较 |
SORT_NUMERIC | 单元被作为数字来比较 |
SORT_STRING | 单元被作为字符串来比较 |
每个数组之后不能指定两个同类的排序标志,且每个数组后指定的排序标志仅对该数组有效,如果缺少对应标志将采用默认值。
输入数组被当成一个表的列并以行来排序,这类似于 SQL 的 ORDER BY 子句功能。第一个数组是要排序的主要数组,单元的值相同的话就按照下一个输入数组中相应值的大小来排序,依此类推。
例子1:
<?php $arr1 = array(1, 3, 2, 4); $arr2 = array("a", "b", "c", "d"); array_multisort($arr1, $arr2); print_r($arr1); print_r($arr2); ?>
运行该例子输出:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 ) Array ( [0] => a [1] => c [2] => b [3] => d )
可见第一个主要数组经过排序后,后面的数组会受到第一个数组的影响而保持对应关系。就上面的例子,哪怕给 arr2 加上 SORT_DESC (降序排列)参数,也不会影响到 arr2 的排序结果。这种影响在多维数组里也存在。
例子2,主数组单元值有同样的情况:
<?php $arr1 = array(1, 2, 2, 4); $arr2 = array("a", "b", "c", "d"); array_multisort($arr1, SORT_DESC, $arr2, SORT_ASC); print_r($arr1); print_r($arr2); ?>
运行该例子输出:
Array ( [0] => 4 [1] => 2 [2] => 2 [3] => 1 ) Array ( [0] => d [1] => b [2] => c [3] => a )
例子3,多维数组排序:
<?php $arr = array (array (1, 2, 3, 4), array ("a", "b", "b", "d")); array_multisort($arr[0], SORT_DESC, $arr[1], SORT_ASC); print_r($arr); ?>
运行该例子输出:
Array ( [0] => Array ( [0] => 4 [1] => 2 [2] => 2 [3] => 1 ) [1] => Array ( [0] => d [1] => b [2] => c [3] => a ) )
例子4,数字与字符混合:
<?php $arr = array (array ("11", 2, 2, "a"), array (1, 2, 3, 4)); array_multisort($arr[0], SORT_ASC, SORT_STRING, $arr[1], SORT_NUMERIC, SORT_DESC); var_dump($arr); ?>
运行该例子输出:
array(2) { [0]=> array(4) { [0] => string(2) "11" [1] => int(2) [2] => int(2) [3] => string(1) "a" } [1]=> array(4) { [0] => int(1) [1] => int(3) [2] => int(2) [3] => int(4) } }
shuffle()
PHP shuffle() 函数随机排列数组单元的顺序(将数组打乱)。本函数为数组中的单元赋予新的键名,这将删除原有的键名而不仅是重新排序。
语法:
bool shuffle ( array &array )
例子1:
<?php $arr = range(1,8); print_r($arr); echo '<br />'; shuffle($arr); print_r($arr); ?>
运行该例子输出:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7 [7] => 8 ) Array ( [0] => 6 [1] => 1 [2] => 3 [3] => 2 [4] => 5 [5] => 7 [6] => 8 [7] => 4 )
需要说明的是,每次刷新页面,shuffle($arr) 后的 print_r($arr) 结果都是不一样的。而自 PHP 4.2.0 起,也不再需要用 srand() 等函数给随机数发生器播种而由系统自动完成。
例子2,使用关联数组:
<?php $arr = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5); shuffle($arr); print_r($arr); ?>
运行该例子输出:
Array ( [0] => 5 [1] => 2 [2] => 1 [3] => 3 [4] => 4 )
当然,每次刷新页面输出的结果都是不一样的。