PHP最强大的功能大概就是处理数组了。PHP允许开发者创建由各种不同数据类型的键和值组成的数组,并允许你对它进行排序、分割和组合等多种操作。
力量越大,责任越大。找到最佳的办法来处理如此复杂的数组并不是一件轻松的事。本章一方面考察你对数组工作机制的认识——不光是理论上的,还要求实践。另一方面考察你“人工处理”简单脚本——指出哪里出错或者脚本将输出什么的能力。
问题
1.索引数组的键是______,关联数组的键是______。
A.浮点,字符串
B.正数,负数
C.偶数,字符串
D.字符串,布尔值
E.整型,字符串
2.考虑如下数组,怎样才能从数组$multi_array中找出值cat?
[php]<?php
$multi_array = array("red",
"green",
42 => "blue",
"yellow" => array("apple",9 => "pear","banana",
"orange" => array("dog","cat","iguana")));
?>[/php]
A.$multi_array['yellow']['apple'][0]
B.$multi_array['blue'][0]['orange'][1]
C.$multi_array[3][3][2]
D.$multi_array['yellow']['orange']['cat']
E.$multi_array['yellow']['orange'][1]
3.运行以下脚本后,数组$array的内容是什么?
[php]<?php
$array = array ('1', '1');
foreach ($array as $k => $v) {
$v = 2;
}
?>[/php]
A.array ('2', '2')
B.array ('1', '1')
C.array (2, 2)
D.array (Null, Null)
E.array (1, 1)
4.对数组进行升序排序并保留索引关系,应该用哪个函数?
A.ksort()
B.asort()
C.krsort()
D.sort()
E.usort()
5.哪个函数能把数组转化能字符串?
答案:____________
6.以下脚本将按什么顺序输出数组$array内的元素?
[php]<?php
$array = array ('a1', 'a3', 'a5', 'a10', 'a20');
natsort ($array);
var_dump ($array);
?>[/php]
A.a1, a3, a5, a10, a20
B.a1, a20, a3, a5, a10
C.a10, a1, a20, a3, a5
D.a1, a10, a5, a20, a3
E.a1, a10, a20, a3, a5
7.哪个函数能把下方数组的内容倒序排列(即排列为:array('d', 'c', 'b', 'a'))?(双选)
[php]<?php
$array = array ('a', 'b', 'c', 'd');
?>[/php]
A.array_flip()
B.array_reverse()
C.sort()
D.rsort()
E.以上都不对
8.以下脚本输出什么?
[php]<?php
$array = array ('3' => 'a', '1b' => 'b', 'c', 'd');
echo ($array[1]);
?>[/php]
A.1
B.b
C.c
D.一个警告
E.a
9.哪种方法用来计算数组所有元素的总和最简便?
A.用for循环遍历数组
B.用foreach循环遍历数组
C.用array_intersect函数
D.用array_sum函数
E.用array_count_values()
10.以下脚本输出什么?
[php]<?php
$array = array (0.1 => 'a', 0.2 => 'b');
echo count ($array);
?>[/php]
A.1
B.2
C.0
D.什么都没有
E.0.3
11.以下脚本输出什么?
[php]<?php
$array = array (true => 'a', 1 => 'b');
var_dump ($aray);
?>[/php]
A.1 => 'b'
B.True => 'a', 1 => 'b'
C.0 => 'a', 1 => 'b'
D.什么都没有
E.输出NULL
12.在不考虑实际用途的前提下,把数组直接传给一个只读函数比通过引用传递的复杂度低?
A.是的,因为在把它传递给函数时,解释器需要复制这个数组
B.是的,如果函数修改数组的内容的话
C.是的,如果这个数组很大的话
D.是的,因为PHP需要监视函数的输出,已确定数组是否被改变
E.不是
12.以下脚本输出什么?
[php]<?php
function sort_my_array ($array)
{
return sort ($array);
}
$a1 = array (3, 2, 1);
var_dump (sort_my_array (&$a1));
?>[/php]
A.NULL
B.0 => 1, 1 => 2, 2 => 3
C.一个引用错误
D.2 => 1, 1 => 2, 0 => 3
E.bool(true)
13.以下脚本输出什么?
[php]<?php
$result = '';
function glue ($val)
{
global $result;
$result .= $val;
}
$array = array ('a', 'b', 'c', 'd');
array_walk ($array, 'glue');
echo $result;
?>[/php]
答案:____________
15.以下脚本输出什么?
[php]<?php
$array = array (1, 2, 3, 5, 8, 13, 21, 34, 55);
$sum = 0;
for ($i = 0; $i < 5; $i++) {
$sum += $array[$array[$i]];
}
echo $sum;
?>[/php]
A.78
B.19
C.NULL
D.5
E.0
答案速查
1:E
2:E
3:B
4:B
5:serialize/implode
6:A
7:BD
8:D
9:D
10:A
11:E
12:E
13:E
14:abcd
15:A
答案详解
1.键名是整型数字(integer)的数组叫索引数组,键名是字符串的数组叫关联数组。正确答案是E。
2.cat被包含在另外两个数组中。顺藤摸瓜,首先,键yellow必须要用到,它跟在orange后面。最内部的数组是个索引数组,字符串cat是第二个值,它的索引是1。正确答案是E。
3.答案是B。foreach操作的是$array的副本,因此对原来的值没有影响。
4.只有asort函数能在保留原有索引关系的前提下进行排序。答案是B。
5.serialize函数能把复杂的数据结构转换成字符串,并可以用unserialize函数再转换回原先的结构。还有implode函数,它可以把数组中的所有元素组成一个字符串。
6.函数natsort()使用“自然排序”法对数组进行排序。在本题中,数组元素已经“自然”排列了,因此函数根本没有改变数组。答案是A。
7.array_flip()只能把数组中每个元素的键和值进行交换。rsort()和array_reverse()则能把题目中的数组逆向排序为需要的形式(’d’,’c’,’b’,’a’)。答案是B和D。
8.给数组中的元素设置数字键时,PHP从可用的最小的数字开始,递增设置。如果没有指定从哪个数字开始,PHP将从0开始。本题中,3是第一个元素的键,因此,第三个元素的键将被设置为4,最后一个元素是5。注意,1b不是数字。因此,键是1的值不存在,答案是D。
9.array_sum函数计算数组中所有元素的总和。答案是D。
10.脚本输出1(答案是A)。因为只有整型数字和字符串可以被用来做数组的键——浮点数字会被转换成整型数字。所以0.1和0.2会被转换成0,$array中只有0=>’b’这个元素。
11.这题试图把你的注意力从真正的问题上转移开。true等同于数字1,因此$array数组将只包含一个元素。然而在var_dump()函数里出现了一个错误——$array被错拼成了$aray,少了一个“r”。因此var_dump将输出NULL(也可能是一个提示 ,这取决于你的设置)。答案是E。
12.这题有些绕人。首先,注意两点:第一,你并非一定要使用这两种方式来传递数组。如果需要用一个函数来修改数组的内容,通过引用传递将是唯一的方法——但题中不是这种情况;第二,题目强调把数组传递个一个只读函数。如果不是这样,由于对数组进行改变将产生一个该数组的副本,答案会是B。然而常规情况下,PHP需要创建一套结构来维持一个引用,另一方面,由于PHP采用懒拷贝(lazy-copy)——又叫写时拷贝(copy-on-write)——机制,变量在被改变之前不会产生副本,所以通过引用将数组传递给一个不修改数组内容的函数比通过值传递要慢,而通过值传递是一种快速、安全的在函数间共用数组的方式。答案是E。
13.答案是E。sort函数不产生或返回数组副本,而是直接对传递给它的数组本体进行操作。该函数只返回布尔值true,代表排序成功(或者false,代表出错)。注意,这里将数组$a1引用传递给了sort_my_array(),我们不赞成这样做,应该在函数中重新声明引用。
14.array_walk函数将一个指定函数应用在数组中的每个元素上。因此脚本glue函数将把数组中的所有元素连在一起,输出abcd。
15.本题主要考验你分析脚本的能力。你也许觉得这题很费解——但我们在调试别人写的代码时却不得不经常面对此类令人不悦的问题。相对于我们所见过的一些代码,这已经算相当简单了。脚本中的for循环了5次,每次都把键是数组$array中键为$i的值的值加进$sum。这听起来有点像绕口令,但如果你一步一步想,你将发现, 当$i等于零时,$array[$array[$i]]等同于$array[$array[0]],也就是$array[1],也就是2。顺着这个思路,最终的答案是78。