PHP 数组详解之函数【一】
- 1. 判断查找
in_array()函数判断数组是否包含某元素;
array_search()在数组中搜索特定值并返回索引号/键名,如果不存在则返回false。 - 2. 数组排序
sort()/rsort()保持键的位置,依值排序;
asort()/arsort()依值排序,保持键值对应;
ksort()/krsort()依键排序,保持键值对应;
natsort()/natcasesort()按自然顺序重排,保持键值对应;
shuffle()随机排序。
array_reverse()逆转数组。 - 3. 统计计算
count()数组元素计数;
min()数组最小值;
max()数组最大值;
arrary_sum()数组求和。
< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />
实验步骤
一、数组的特殊变换
- 1. 变量组合成数组
compact()函数可以通过变量名的字符串清单来将相关变量组合成一个关联数组。请阅读并运行以下代码,理解compact()函数的用法。
<html>
<body>
<pre>
<?php
$zero = 0;
$one = 1;
$two = 2;
$three = 3;
$arr = compact("zero", "one", "two", "three");
print_r($arr);
?>
</pre>
</body>
</html>
- 2. 数组分拆为变量
除了使用list()操作符从数组中抽取变量外,PHP还可以使用extract()函数来抽取变量。请阅读并运行以下代码,理解extract()函数从数组抽取变量的方法。
注:代码中的常量EXTR_PREFIX_ALL是用于说明抽取为变量时全部加上前缀;常量EXTR_REFS则表示抽取的变量为数组元素的引用(变量引用容易误解,尽量少用)。
<html>
<body>
<pre>
<?php
$arr1 = array("zero", "one", "two", "three");
extract($arr1, EXTR_PREFIX_ALL, "var");
echo $var_0 . "<br />";
echo $var_1 . "<br />";
echo $var_2 . "<br />";
echo $var_3 . "<br />";
echo "<br />";
$var_0 .= " is 0";
echo $var_0 . "<br />";;
print_r($arr1);
echo "<hr />";
$arr2 = array("math" => 95, "english" => 75);
extract($arr2, EXTR_REFS | EXTR_PREFIX_ALL, "score");
echo $score_math . "<br />";
echo $score_english . "<br />";
echo "<br />";
$score_math += 3;
$score_english -= 5;
print_r($arr2);
?>
</pre>
</body>
</html>
- 3. 数组分解
array_keys()和array_values()函数可以将数组的键名和值分别抽取出来形成新的数组。请阅读并运行以下代码,理解array_keys()和array_values()函数的用法。
<html>
<body>
<pre>
<?php
$arr = array("zero" =>0, "one" => 1, "two" =>2, "three" =>3);
$keys = array_keys($arr);
$values = array_values($arr);
print_r($keys);
print_r($values);
?>
</pre>
</body>
</html>
- 4. 数组合并
array_combine()函数可以将一个包含键名的数组和一个包含值的数组并成一个关联数组。注意:array_combine()函数要求两个数组参数具有相同的元素个数。请阅读并运行以下代码,理解array_combine()函数的用法。
<html>
<body>
<pre>
<?php
$keys = array("zero", "one", "two", "three");
$values = array(0, 1, 2, 3);
$arr = array_combine($keys, $values);
print_r($arr);
?>
</pre>
</body>
</html>
- 5. 数组转为字符串
implode()函数可以将一个数组的所有值转为一个字符串;用它的第1个参数指定元素间的分隔符。注意:转换后的字符串并不包含键名。请阅读并运行以下代码,理解implode()函数的用法。
<html>
<body>
<pre>
<?php
$arr = array("zero" =>0, "one" => 1, "two" =>2, "three" =>3);
$str = implode(",", $arr);
echo $str;
?>
</pre>
</body>
</html>
- 6. 数组初始化为序列
range()函数可以返回一个数值区间的序列,其第1个参数是开始值,第2个参数是结束值,可选的第3个参数是步长。请阅读并运行以下代码,理解range()函数的用法。
<html>
<body>
<pre>
<?php
$arr1 = range(0,5);
$arr2 = range(0,10,2);
$arr3 = range(0, -1, -0.1);
$arr4 = range('e', 'a', -1);
$arr5 = range('A', 'z'); // 在字符集中大写是排在小写前面的
print_r($arr1);
print_r($arr2);
print_r($arr3);
print_r($arr4);
print_r($arr5);
?>
</pre>
</body>
</html>
二、判断查找
- 1. in_array()
运行以下程序,观察程序运行结果,理解in_array()的使用方式。注:range函数可产生系列数字组成的数组。
<html>
<body>
<pre>
<?php
$arr1 = range(0, 9);
echo "数组arr1为:" ;
print_r($arr1);
if (in_array(1, $arr1)) {
echo "1在数组arr1中。";
} else {
echo "1不在数组arr1中。";
}
$arr2 = range(0,9,2);
echo "<hr />数组arr2为:" ;
print_r($arr2);
if (in_array(1, $arr2)) {
echo "1在数组arr2中。";
} else {
echo "1不在数组arr2中。";
}
?>
</pre>
</body>
</html>
- 2. arrary_search()
运行以下程序,观察程序运行结果,理解array_search()的使用方式。
<html>
<body>
<pre>
<?php
$arr1 = range(0, 9);
echo "数组arr1为:" ;
print_r($arr1);
$key = array_search(1, $arr1);
echo var_dump($key);
$arr2 = range(0,9,2);
echo "<hr />数组arr2为:" ;
print_r($arr2);
$key = array_search(1, $arr2);
echo var_dump($key);
$arr3 = array("zero" => 0, "one" => 1, "two" => 2, "three" => 3);
echo "<hr />数组arr3为:" ;
print_r($arr3);
$key = array_search(1, $arr3);
echo var_dump($key);
?>
</pre>
</body>
</html>
通过以上实验,可以知道:如果要查找的元素在索引数组的0号位置,array_search将返回什么? 。
三、数组排序
注意:PHP的排序函数都是对原数组进行修改的。
- 1. 请阅读并运行以下代码,观察运行结果。
<html>
<body>
<pre>
<?php
$arr = array(
"zero" => "number:0-零",
"one" => "number:1-壹",
"two" => "number:2-贰",
"three" => "number:3-叁",
"four" => "number:4-肆",
"five" => "number:5-伍",
"six" => "number:6-陆",
"seven" => "number:7-柒",
"eight" => "number:8-捌",
"nine" => "number:9-玖",
"ten" => "number:10-拾",
"GE" => "NUMBER:1-个",
"SHI" => "NUMBER:10-十",
"BAI" => "NUMBER:100-百",
"QIAN" => "NUMBER:1000-千");
echo "原数组:";
print_r($arr);
echo "排序后:";
sort($arr);
print_r($arr);
?>
</pre>
</body>
</html>
请将代码中的sort函数分别换成rsort、asort()/arsort()、ksort()/krsort()、natsort()/natcasesort()、shuffle()和array_reverse()观察运行效果。使用哪一个函数会得到下面的排列顺序? 。
Array
(
[zero] => number:0-零
[GE] => NUMBER:1-个
[one] => number:1-壹
[two] => number:2-贰
[three] => number:3-叁
[four] => number:4-肆
[five] => number:5-伍
[six] => number:6-陆
[seven] => number:7-柒
[eight] => number:8-捌
[nine] => number:9-玖
[SHI] => NUMBER:10-十
[ten] => number:10-拾
[BAI] => NUMBER:100-百
[QIAN] => NUMBER:1000-千
)
四、统计计算
请阅读并运行以下代码,观察运行结果,理解count()、min()、max()和array_sum()函数的功能。
<html>
<body>
<pre>
<?php
$arr = range(0, 10, 2);
print_r($arr);
echo "共有元素". count($arr) . "个;";
echo "最小值是". min($arr) . ";";
echo "最大值是". max($arr) . ";";
echo "元素和是". array_sum($arr) . "。";
?>
</pre>
</body>
</html>
五、数组的高级操作
以下函数array_map()、array_filter()和array_reduce()可以实现大量的数据处理,简化编程而不必写循环语句。注意这3个函数是返回新生成的数组,并不会修改原数组。后面的示例使用到的匿名函数需要PHP 5.3或以上才支持。
- 1. 数组映射
以下代码中,$double那句的语法含义是:定义一个匿名函数并赋值给变量$double。
请观察运行结果,理解array_map()的用法。
<html>
<body>
<pre>
<?php
function cube($n)
{
return($n * $n * $n);
}
$a = range(0,5);
$b = array_map("cube", $a);
print_r($b);
$double = function($value) {
return $value * 2;
};
$a = range(0, 5);
$b = array_map($double, $a);
print_r($b);
?>
</pre>
</body>
</html>
- 2. 数组过滤
请观察运行结果,理解array_filter()的用法。
<html>
<body>
<pre>
<?php
$func = function ($value) {
if ($value>5 && $value<10) {
return true;
} else {
return false;
}
};
$a = range(0, 20);
$b = array_filter($a, $func);
print_r($b);
?>
</pre>
</body>
</html>
- 3. 数组累积
请观察运行结果,理解array_reduce()的用法。array_reduce的功能就是将回调函数迭代的作用在数组的每一个元素上,从而将数组简化成单一值;第三个参数为迭代器的初始值。
<html>
<body>
<pre>
<?php
function rsum($v, $w)
{
$v += $w;
return $v;
}
function rmul($v, $w)
{
$v *= $w;
return $v;
}
$a = range(1, 5);
$x = array();
echo array_reduce($a, "rsum") . "<br />"; // 1+2+3+4+5
echo array_reduce($a, "rmul", 10) . "<br />"; // 10 * 1*2*3*4*5
echo array_reduce($x, "rsum", 100) . "<br />"; // 100 + 0(NULL)
?>
</pre>
</body>
</html>
六、设计练习
- 1. 以下代码的运行结果与期望的不相符,请找出错误原因。提示:请从PHP中与false的等价值方面考虑。
<html>
<body>
<pre>
<?php
$arr1 = range(0, 9);
echo "数组arr1为:" ;
print_r($arr1);
$key = array_search(0, $arr1);
if ($key != false) {
echo "0在数组arr1中,索引/键名是 $key 。";
} else {
echo "0不在数组arr1中。";
}
?>
</pre>
</body>
</html>
以上代码错误原因在于,应该如何修改?