捌玖网络工作室's Archiver

admin 发表于 2008-4-4 02:29

[Zend权威认证试题讲解]第四章 - 数组

PHP最强大的功能大概就是处理数组了。PHP允许开发者创建由各种不同数据类型的键和值组成的数组,并允许你对它进行排序、分割和组合等多种操作。
uo#TvW7j t8R;x 力量越大,责任越大。找到最佳的办法来处理如此复杂的数组并不是一件轻松的事。本章一方面考察你对数组工作机制的认识——不光是理论上的,还要求实践。另一方面考察你“人工处理”简单脚本——指出哪里出错或者脚本将输出什么的能力。O7b'X)`3d+~#t5I!X'q
(K1]\\-f,}}{!w
[#\:K!d}*to.|9b
问题"@"m C X:n#e

5jTr,E:z'X[a!x.` 1.索引数组的键是______,关联数组的键是______。n1J"P#R(j3Zz
n8]0O4z6[;K
A.浮点,字符串
q;q@Jq"h'^dy B.正数,负数9_\uau'xc;T$?
C.偶数,字符串G"cvQ${6FrU:^
D.字符串,布尔值p$^*A)y8m*t'F
E.整型,字符串
pe'xe+@Ae e &Z*f4T;A7?P!|
.Wb.eK(pf
2.考虑如下数组,怎样才能从数组$multi_array中找出值cat?[code] .A`6v'PT!}
<?php
c.Yk:C Lc/U $multi_array = array("red",
'b ]"NZu-C "green",2UC"Q3L&?S
42 => "blue",
(l Q B;oZ1rM7X-E_ _1@ "yellow" => array("apple",9 => "pear","banana",
c9w:x(Gq]$VmkX$^w "orange" => array("dog","cat","iguana")));
XU,LqkbP-e8j ?>[/code]A.$multi_array['yellow']['apple'][0]RmbG y#jr1q
B.$multi_array['blue'][0]['orange'][1]5g4sPp+rJ nDe
C.$multi_array[3][3][2]tz%R4D"Kh#F3c
D.$multi_array['yellow']['orange']['cat']
l1?Y$KzR7X E.$multi_array['yellow']['orange'][1]7G tD*S @f;[DF9Q2A
F/X%G,qIkR
%pz#KN^9f8{%N
3.运行以下脚本后,数组$array的内容是什么?[code] *M2Ohl p ?
<?php
6xo/x+[Oh9z1c_ $array = array ('1', '1');*z/_~Kul2M.C5c#C
foreach ($array as $k => $v) {6M5J/^%Ovr{A
        $v = 2;Z S#Q(Wc8]-f
}2ieC'QP M%|L
?>[/code]A.array ('2', '2')l[.}d.X }:s'L
B.array ('1', '1')
~Y5x+m]M$@2G;S C.array (2, 2)
"Uw2T8n#Q8rM`2_ D.array (Null, Null)
p7N-`&b ZP)H8^A W E.array (1, 1)
a/|&VK'?5Z 'X:tcX'Bk

F)ZOc v1@Q 4.对数组进行升序排序并保留索引关系,应该用哪个函数?]\2p+U.A h

,zon G'_p p A.ksort()
1J Ie5`+R;_%} B.asort()o$i#}DOh:W+G"`
C.krsort()
~+SiQSu(]&l D.sort()
amw Z[{ x,y E.usort()4tZ+y0S"^&YH fM {*_

}\ PrXGE PS M%M;by4I4hj/G
5.哪个函数能把数组转化能字符串?
ieI'{:Q [l;c
J ? bt9ha.l3[v 答案:____________
-za6FIu XLXMcb u+Y
0a]R,R(F
6.以下脚本将按什么顺序输出数组$array内的元素?[code]
,e `(A1u"fM <?php
8v s8vsReCw $array = array ('a1', 'a3', 'a5', 'a10', 'a20');
&Zx-~/|AlN&bhK natsort ($array);+TA C|0W3[.ht v
var_dump ($array);
dn4k?g8\.lA ?>[/code]A.a1, a3, a5, a10, a20"`s$l IA,j jX5B
B.a1, a20, a3, a5, a105|\-a$rv@$j
C.a10, a1, a20, a3, a5.t4b&D"S@9J
D.a1, a10, a5, a20, a3y?)NI g
E.a1, a10, a20, a3, a5%pO`'L@go

m[ ]jX:?)C :sg@9g8DA0`+Q
7.哪个函数能把下方数组的内容倒序排列(即排列为:array('d', 'c', 'b', 'a'))?(双选)[code]
9D;kHrK^3D <?php
8D AEL$SJ7e $array = array ('a', 'b', 'c', 'd');3M6m!Yl$Q_r3Q }I'c
?>[/code]A.array_flip()S FP2?]|Ag J*~%m
B.array_reverse()
8n9A8EE3N}"o4b[Io!` C.sort()TA$cu0va I
D.rsort()Rj,O `A"RqFt
E.以上都不对'soX~m
1h+t7qa1i Q5M_c
_p'pP4R+Xf
8.以下脚本输出什么?[code] "T;`7B[qE
<?php'py _%OUh2I.du3?C`
$array = array ('3' => 'a', '1b' => 'b', 'c', 'd');_!Ni)S7lmZws
echo ($array[1]);$Fy\&El/}&by
?>[/code]A.1
/fw~+yF"[ B.bsX1|,T)G$XIK&k
C.cU@dzuOk
D.一个警告
E.V|aoL E.a,`+m3wm$g2aD,{
dx#F+V+q$g

g&E |!G2z,A*d2X;dK/y#y 9.哪种方法用来计算数组所有元素的总和最简便?
!q]p$q$Kq gF
"Kh,[*F;X I*Z A.用for循环遍历数组
yV_DR;XjI B.用foreach循环遍历数组BYD1x B3iR
C.用array_intersect函数
W~g'H7Vxv{)O D.用array_sum函数*Id@Y r%s
E.用array_count_values()BFKxv\] GE G Z
#I~l!`0^^n`
T3B)jg1gk'I-~ tu
10.以下脚本输出什么?[code] 2yE%g#uY3~U#F9@Q;D`$V Z
<?php
lLI+N%o [*Q $array = array (0.1 => 'a', 0.2 => 'b');cKn{ |
echo count ($array);g#tfjg!g$w[
?>[/code]A.1
(h*m|*qV/L~ z |F B.2P9P.YZR7Zt
C.0
)?"zA,eg D.什么都没有
;U A6|V\K E.0.3&\ R _ok_}b U2K [
v'IB3aEr4x$B

9J?A&{.Wd 11.以下脚本输出什么?[code] y`U5`k;MXLB@}a
<?php
Fjjz2B5V}yWj $array = array (true => 'a', 1 => 'b');|RN$u(k5@e
var_dump ($aray);%R'xKa~:BLy8w
?>[/code]A.1 => 'b'%wm-W'Jn9z,a
B.True => 'a', 1 => 'b'
+z/H:dF s5V C.0 => 'a', 1 => 'b'
/F$fS5I(dt D.什么都没有
3O/eq v(CqC E.输出NULL
?#~PO,??"aUVg
liT)I KF ^ |TX
D+r&Q!Z&c0Q 12.在不考虑实际用途的前提下,把数组直接传给一个只读函数比通过引用传递的复杂度低?|7yIf4b F

}Wj }|P.H2_ A.是的,因为在把它传递给函数时,解释器需要复制这个数组?8OS/h&?5vL
B.是的,如果函数修改数组的内容的话kQG[+B*LV(x"b
C.是的,如果这个数组很大的话
Bh/e}\@ D.是的,因为PHP需要监视函数的输出,已确定数组是否被改变oEcG3w/zl.T |
E.不是])pl)z:l4?(sa+Y
YIq.T^4Z2PcY

{1Rh,Ux NW3_Sz 12.以下脚本输出什么?[code]
8O NA]-[4k4G%h:L <?phpV{*Q,uuUq-gz9Q
function sort_my_array ($array)!]mU5R-iX"f
{
8D6e4\7g4A n1V*u         return sort ($array); I%|{a?#rF
}p7{;I Wbb$a
$a1 = array (3, 2, 1);-psH%~^v-i g
var_dump (sort_my_array (&$a1));
evv0v+k ?>[/code]A.NULL
sl rlEz^[)Xw B.0 => 1, 1 => 2, 2 => 3 {/H(V:MR:K9se
C.一个引用错误E9ya3@7H'M
D.2 => 1, 1 => 2, 0 => 3b0] M-l4_Y^i,B
E.bool(true)
w#j?^Q J!O g3J+i&R9]K7O

5N d2_.[4Xm 13.以下脚本输出什么?[code] wiy P7H0b
<?php8X a"um"Z]0`j
$result = '';
@o0j'M-v F2rQ G function glue ($val)
ac;Y"AD-j$n(tWv&O lH {
!{&w,W^J6U c         global $result;e,w4L"b4a9S%mg#A2`
        $result .= $val;-a"iC O'xBT
}
*sH_DB }b$C ~i1Z $array = array ('a', 'b', 'c', 'd');
1F(~_ K5x'dE9J array_walk ($array, 'glue');
L B9?jjS7_,p;`#B echo $result;
P.[KiORH c ?>[/code]答案:____________1J(|q!^x0|.B V

/`u+Tu8xh \1`G ? _N4z\j NLN
15.以下脚本输出什么?[code] }TbX8RPAw
<?php4L)qtv/lO$wAr
$array = array (1, 2, 3, 5, 8, 13, 21, 34, 55);
9q:A Spo2I{&y7K)Bq1g $sum = 0;O1T Tz&Y7P-w3];U j
for ($i = 0; $i < 5; $i++) {
oW N;?IJ(F $sum += $array[$array[$i]];
9V1w`)wvxzP }2z&i,OS"V m
echo $sum; GTvKe Z k
?>[/code]A.78
"VM!_A%qD| B.19F9F7x h n!|A T
C.NULL"K:{9kD6~*Pgn
D.5gq/{]&u%W0] o
E.0Al3J D/E8@
[y.Lc/cQd

@g(^0bq as:yi
}#oh*Z6}2_ 答案速查
L#}/ZY:nK&h_$}f;B 1:E
~'E+W$m(X5}8FZ 2:E
'Y6rQH!f)Uswi 3:B"bBw3U+T8_w$F(N
4:B
2|H ?.qj;Um7x2o:It1V 5:serialize/implode
9^ y2`S2^/G V 6:AT3{ Da`X_y:z/~
7:BD(mex7jluT
8:D
y4He+gm6]c3x 9:D
q3|U0U%u{ g 10:A
5A4x^ qo? 11:E
)@5u]"F4i0]C:B7O-OW2w!z 12:E
{(^ Z1]]"O 13:E
!Qm^?B[h 14:abcd
ww)Sa^1{j&x$F 15:A|$J`#R sOe Cf

)X}c~6XW8xE
$E;G W,l s.z
L}#K6O3B"``a 答案详解 \m vw9e.di
"M"l y(v6Rf{^z0W
1.键名是整型数字(integer)的数组叫索引数组,键名是字符串的数组叫关联数组。正确答案是E。
0@ O8Bcxs9[
c~7`}`3Q 2.cat被包含在另外两个数组中。顺藤摸瓜,首先,键yellow必须要用到,它跟在orange后面。最内部的数组是个索引数组,字符串cat是第二个值,它的索引是1。正确答案是E。
d}+n7Qnd1K6OV
j/m8dJ:i2`1|M 3.答案是B。foreach操作的是$array的副本,因此对原来的值没有影响。
w+{v%t@ KQ8F"W
c X7Q1l\G V"t@-H!`\T 4.只有asort函数能在保留原有索引关系的前提下进行排序。答案是B。
[:`*P-N5Pm
n v#_U/x_W 5.serialize函数能把复杂的数据结构转换成字符串,并可以用unserialize函数再转换回原先的结构。还有implode函数,它可以把数组中的所有元素组成一个字符串。
(]e?uN(M Wj]8H Y Ajr.^~
6.函数natsort()使用“自然排序”法对数组进行排序。在本题中,数组元素已经“自然”排列了,因此函数根本没有改变数组。答案是A。~h|5?7mG
.HSExa5BA.|
7.array_flip()只能把数组中每个元素的键和值进行交换。rsort()和array_reverse()则能把题目中的数组逆向排序为需要的形式(’d’,’c’,’b’,’a’)。答案是B和D。
l*Wzx6Ny}$d
w(G/qi0B$m| 8.给数组中的元素设置数字键时,PHP从可用的最小的数字开始,递增设置。如果没有指定从哪个数字开始,PHP将从0开始。本题中,3是第一个元素的键,因此,第三个元素的键将被设置为4,最后一个元素是5。注意,1b不是数字。因此,键是1的值不存在,答案是D。}SW1UW^*|8s

C,f!?'T~!j 9.array_sum函数计算数组中所有元素的总和。答案是D。
9\.fl#\dj'G6is j/m*t4m`T4KC
10.脚本输出1(答案是A)。因为只有整型数字和字符串可以被用来做数组的键——浮点数字会被转换成整型数字。所以0.1和0.2会被转换成0,$array中只有0=>’b’这个元素。!o dfkgk*i
"GVD`'z4v
11.这题试图把你的注意力从真正的问题上转移开。true等同于数字1,因此$array数组将只包含一个元素。然而在var_dump()函数里出现了一个错误——$array被错拼成了$aray,少了一个“r”。因此var_dump将输出NULL(也可能是一个提示 ,这取决于你的设置)。答案是E。 s8G Vf6q o

6x{,ZyV~"p}@ 12.这题有些绕人。首先,注意两点:第一,你并非一定要使用这两种方式来传递数组。如果需要用一个函数来修改数组的内容,通过引用传递将是唯一的方法——但题中不是这种情况;第二,题目强调把数组传递个一个只读函数。如果不是这样,由于对数组进行改变将产生一个该数组的副本,答案会是B。然而常规情况下,PHP需要创建一套结构来维持一个引用,另一方面,由于PHP采用懒拷贝(lazy-copy)——又叫写时拷贝(copy-on-write)——机制,变量在被改变之前不会产生副本,所以通过引用将数组传递给一个不修改数组内容的函数比通过值传递要慢,而通过值传递是一种快速、安全的在函数间共用数组的方式。答案是E。
N x$r;`g%@
m1viYA"~Ps^~ 13.答案是E。sort函数不产生或返回数组副本,而是直接对传递给它的数组本体进行操作。该函数只返回布尔值true,代表排序成功(或者false,代表出错)。注意,这里将数组$a1引用传递给了sort_my_array(),我们不赞成这样做,应该在函数中重新声明引用。;MDN:t#xP#JC x]T

a9TN7B ^l2n7{,S0Y 14.array_walk函数将一个指定函数应用在数组中的每个元素上。因此脚本glue函数将把数组中的所有元素连在一起,输出abcd。Z0s6F$X)z
){0Xz x0z5b3{
15.本题主要考验你分析脚本的能力。你也许觉得这题很费解——但我们在调试别人写的代码时却不得不经常面对此类令人不悦的问题。相对于我们所见过的一些代码,这已经算相当简单了。脚本中的for循环了5次,每次都把键是数组$array中键为$i的值的值加进$sum。这听起来有点像绕口令,但如果你一步一步想,你将发现, 当$i等于零时,$array[$array[$i]]等同于$array[$array[0]],也就是$array[1],也就是2。顺着这个思路,最终的答案是78。

页: [1]
【捌玖网络】已经运行:


Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.