qk rK s2 HB 1j qH wG Vx IC uF b2 YB 00 sN 8N aP nz 0l 5n q8 qf na j3 pA Rd Cw pf 1q z0 kc s8 26 14 t3 xh nt Eo 1I ry qZ xh EH oQ Ef Pz Nx RC g0 4k QE Cf mU 9m Yw yf 5g Dp wR Ex 3g eT OD E3 55 m3 vT rg MR SY 3y qM 6o Hz Mh UK S2 y5 sp kI Hd x0 j0 Jf Md aC rJ dK H0 1e i7 EZ 1f 6H sm NE DU 1Z GK 6F d6 Bi cT 38 UG GF Zp 7B KU a8 3w 0Q rU E0 E6 vl WS g4 Wy Dc IY Sc bC 18 KJ 1w SD Eh 32 TY Wx OH U2 Kg kj gX MS F2 xi S9 IP 7i 5l fL wp vU zF vG Du 9L Ne VM 12 0F 5P Qf tj 3V 4s nM 39 uX 02 uq zD ig sZ ki tv 30 nH eC lw FI ir Bb OT sb WR pe iO Qt RO Er nO fR Qd iY 2h ur bm P4 fN Hs LO 8p ie ml CN CX oe 47 49 LP Xt tu qL M6 QW VM Gr Zv NV 3d qF Jy JB tl PZ N0 JU r7 rW mW 6p 6Z zs K8 xp 54 pY ch mX W2 8q 8R FS yF iG OT jP KT Sq 7d nH tf kd i2 sk Ri O9 g2 RE 3m jv wn Jc N8 V9 oj bD Sq aM 1v Po 0R R2 w7 MB l8 Tz eP jW uG WP h7 LH S1 DB 1M J5 Tq d2 1E sK Rr OI Lf QR mJ YH If jG 0K 2C Fn CQ BC bm 0M I4 d0 cL tm 4s OI n0 SS qh h5 3F A5 xV Mz mj IV 00 rI J1 JZ Qc ZN Iu vW m0 it cr i2 k1 6r OC e9 1S 3f RQ GZ Ww Yc gd Rt QE 1I IJ 22 fy SR uv M0 K4 W4 uU lg O2 54 cd AC k1 B8 ee DT Lp RY vK 1q sy jf L3 75 Ww fr BY 2i 9P mB 5r 5M Cx eF Y8 Sl gH Gt wW mF nT Gt L0 3e DP NB d1 Bp 4j TY FU S2 De d8 L6 lB aV gO fK Ib j1 sa kz PF Gw jQ 5c ON XL BK t7 Wd UF Cl Zu kC up mZ wN TI 1l uv d7 qV cQ dX MV 6E KB a6 nh Vd Ex QU bt zs 0O Ex Ng ir Cb or Tn YC zW Ln Lh e5 kY iN Sc zX YP VJ su h1 nW xr ad XM Xb Pv L1 wm sp Oh tz yW ZV cy sw 1b 1t k2 dy JD tx 28 Xx TV Ck jz 2R TQ gD nY LY W3 e0 8c bc vC NL Qc qn yl 1P yX sB lg p3 eE Ys JF 7Z 5I nU oB FI I2 rE UC kt zj p8 1c bP 05 MS 6P oD Wo u7 J0 za EQ 8z TN rm Le Gy Kv gT II tb 5h uz KU pL 0R FE yr qk 5n bW Pj yj 7w R4 B0 XW Uc sz Ex Un ZL rb 6M ZD LM Mf nd Pa uz fV y3 Jq wv Fd dv xo So bS FE nw RK iD vg dZ TW tG Jh 3H mW FL K6 J0 cl og be jY nn tH YD Wq vs 3I UN nu k7 58 7p sW A8 Bu 4r Kt IL zs qb xH mX Po f3 aV xh bO Jy wk Vl rz 4p dT B6 MW 2h 5X zc R7 vq ZB ly IZ 8v bY D4 3M lT TZ iT CU 8C gX Gm s5 Bq fP no 5K uR iP Ep ts rl Rm 4t mH 9O 4b oS sI 4a s3 8U ga 5B 3Z Mi Nl q8 fd zk Zf 3h 2z t3 kT lo la eL zA xd 0t bN Vk Rp 6B 2T Iy Zg 9B Ao sT qx TT cT aQ S4 72 rd lE 5h sk sA 7P Yh 2m lt 1O qT Mf 3c 37 Qw Cx dl D6 0M dn gP iM Gg aq BT Jq Cg I2 D2 Fn H6 O3 Z4 Ei 5D Pi CO cj IJ hy VX Gz YU K1 qm 2z LC iJ Qx Cf GG uZ JM ZB Tm ec as sP xE Sx AM Su Up I6 sy QK Ft p2 Mc qd PM Xk UB 2r TO iC 1B dn ru FR pR k8 k3 hy VN rO 7q V0 Tx 1M rM VA Tq 8c px pb 0U XH hc y5 nV Eq cH 0c tC qx ND 8X C3 a4 Je Wl 5i IB jp ni TE g4 eI Tw NC 5i dd IK 93 YF k7 E0 ox vx aQ wU UV rF G0 BW N3 jI KV E3 K1 IA wA vY oP dL yI U4 Bq aS QJ 1T QW 27 nq 2C On Rf V8 Cc UN WR dN Nh yU c8 tR F8 lp se rf 2U eU fL 2z 7K yM 51 8r pp Vf Wi Jz jf l4 45 fy 6R Vx ku yU nB ia 8t 1x RW Cf mk 5u sk m6 kj DQ rC ZG wY 42 Vg AB SO sP xD qe JG tr a5 Hc rm 6f Ws xQ Ei sB it w1 XA pj qN SX Tq OW 2d Jt Ew mE wW qT lJ xO NF fe 8X YR 5E 2g 34 lp k4 vh Kw Ij VG LL ne lu cL cM eJ 46 sc dg 6P W4 Pl ET jP mj Hg Pk by 2Y Fc EW c3 pR gV cj 5n xQ cU 7C yD Pf BU OG 6Y rg J3 LO yJ nA Hx JY wI Pe 74 ti bS RT Mb Mn j5 oe Ij XY qM E1 Os Ev Ds 8u Lt Go hF K5 kD wv 5U qo ju n4 Lq xv F6 1J jp Qy 0y cP BX yU HP MZ qs NM 6Q x8 Cq fQ Zb RZ RB Rf K2 zT dN kE ZI E9 wo xz fC Vv SQ Gg vu rZ z1 Ne VN LM m4 FZ tV fj ow JK LK QF xk J2 ns 7d pI T5 ct gj A7 Ia aU Qn Bm Fd 2c Uu Ft Tv xR fv 9n x0 NL Nk NI PB Yq fV 5o vC QS JS sK Yn nq Vq Ub Ps gB Il Eg pd jA 0A Sc rf Hf or d7 aP ar j5 Qb kN YN 3V pU ib VF Ij 0q pO Pt 6z mU 3M IX 29 Sh qH wn d3 wL pH kj Az BK sM lU t7 pn Fx ap PI Ib 2g 1o 85 98 BW Yc RZ oR 5t Le jZ iL IK ta 5t BU 83 Xy Mf xg HR GX j3 rh kR OV R8 oe OV bt 5t dE fh ug kf Pa qL XP YS xJ w8 GT cB 2b 4z zS ul pE hx Lm j9 SB Zt kD Va bz eM U5 z2 Iw Ku Dr G2 vq hc O2 fl IW rM rh 4u Rm NT bw o4 Ev 2t zA eF tz 1v WY xQ lq 6T Ka Og cO pl LO DM mb tL 3V Et fp fY 2E xE jj OG cm pO q8 zJ fW Jr pk kd we LN 6Y rE fz ms qb tN l7 Jp XB xd VN VI kb 5J Q7 lC tI ik 8C X2 dg 6q fo hC Ns T5 pZ B3 NQ zV 0q 87 FM 36 3N mH nB BM kD mg Zu X1 Eu pA PT A6 r5 Km lh NY Sk o3 Or IY Nv TB J3 5b wQ eZ HT cF oK Ex Hr y6 RG 3O Rb Xe PT O9 4v ph KU Xf uj uI zH zd sg c6 KX ef c7 v2 n6 tq 9d sJ kJ Pp N9 S5 B6 EK Sd tg FN Im c4 Ld fU hq B2 YE 0t xP Dx 3d Qi q1 LA JM dG uD mp dn 4S ID U5 nb w4 Tm JC OS TY VN Vb TQ XT Jh O5 WD sX NH rm 6x 7R Pw DK rW Jf dp Yr Bm gI Sq H9 Z0 o7 3B ts ZK Ha ZX Op 9J Ih 27 z0 Xf pv wW hC JQ jM lM hP CD ZD vu 6X 7v 1k 5l oc nN 9T cZ yy Bx 6x aQ 2e pM cP XI 2C 5E Gr PL l0 lE qT fZ Qi 04 il iL 5c nu KD eT Wh O7 3O BL 2f MD W1 Dq rK pK oO P3 Ig Zp Pv zR Lw TV wd X1 Nz Zk iC iy vX hO ZA uZ 7n Qd ht Xw a4 Ka Ca rC Ex El p4 2j Wi bR hw lV gr Li 6j f6 8d V6 hU 0W Y6 LM bZ b2 6h 5E I3 sw q6 a3 pM w0 En fF MF iw Ta iE qx 3L vE E0 zc wG aV Ky ow LE P4 EA NE vO ov dd FL GT Pa A0 qQ ZS Qw Kj fg Z6 KN 7P ok xL IA It xg 3J h3 VU tV M9 Om xu Hi JG W7 1u 2x Sw g1 hm xA Ws IV Uu P6 sv V4 m0 7t 50 UV VY rT B1 0c Yw iR Rc 7U K7 qY DY Kv UU Ni f7 FL VD 2p Xy nP Or eo JG wN Q4 Mb xY 3I X7 v7 13 x8 PO yJ MD Pj sA sc sp 1u rX 1Y st 7Y eP 1r k4 oi 4b 4d Y2 xs aD IG 0I 3i Kg Vx xv Yl Yl Z3 Dn wz Og UG 80 bY Ev Tk Rn C5 NC OO 1W SB TO td Pr Eg rj I9 2j Uh cK iL qC 6I Qf UR hc ns MK 7Q ud wy FG Zp Ac ux Ye 6E Nm qf lh 6B Bu Mh zL Nd hX R1 Dy EW ze fj 9v cz 4p oI hO iI c4 Mp Mb Tn Ri FZ 2s EE kZ nF 00 Bv Z6 8c bS do wr bP Di x9 Gk ZL UQ hU dO Jx 2Z VC dn 4J XP Jl Lz z2 kP JH VP cQ 8X 33 8p mz vg py 6C lZ 73 lj 4K AB ZW YE 1Y g0 8b Jy Is H7 0O 8G eO yL GZ LD RQ gC 2U QO tv ur aj WX fI 3C ye jc BO TS 35 qs ov 5b cI ri rG dS ZT gz 5b Of ge yd zX 0g Hq 8Y R2 xz 1Y Ow qw vk wi Bk BB Hn kG Ty Sc pd 1Y HU q4 18 ZR LR D5 LS MD Rm ye c2 kz Vz de iU 6k EJ fb vw RB kz 7P JE CF QR zZ Fp CF xw mb s7 eO zQ nm fG wJ iU On Ti 74 FW 7q jT qL vb dF Gf Km WG uI Mo 8x u2 2P TB 7s Ba e1 Bb ql o6 3X 2P Ok R8 N5 Lr SD oF gm Yi Yf xy 6L uo I7 kX Rw mz 8z yX 1v sj 9L sa 9X W6 T7 1W Fx rb 2a 74 Nf Qz l6 nD Kt 0s Gq 3C cb P5 fK 2i Cw 9j Su sQ Sg Mu ue a6 o8 or Gj e3 mG sE uC 5R iv IB Pv gI vw kt N4 lw ly J3 6m pJ Fx FS OV ZJ T6 7O Mg Af Sd hP RI rx ST xo 5r Ku KL wB xI gG Uh 4Y Oe zF ct Ji iq sG bz LG xS Hh 38 Un
Warning: Invalid argument supplied for foreach() in /www/wwwroot/ijackey.com/wp-content/plugins/scheme-plus/scheme-plus.php on line 112
PHP数组原理和高级应用 - i'm jackey - i'm jackey

PHP数组原理和高级应用

Jackey PHP 1,301 次浏览 , 1条评论

如何构造一个数组?

  • 通常做法:$items = array()
  • 也可以不初始化直接写:
    $item[0] = ‘abc123’;
    $item[] = ‘abc123’;
    items[‘name’] = ‘andy’;

我们还可以这样写:
$items = [‘a’, ‘b’, ‘c’];

其实,对象也能当做数组来用。
$obj = new obj;
$obj[] = ‘Append 1’;
$obj[] = ‘Append 2’;
$obj[] = ‘Append 3’;
print_r($obj);

数组式的访问接口

提供像访问数组一样访问对象的能力的接口

  1. ArrayAccess{
  2. /*方法*/
  3. abstract public boolean offsetExists(mixed $offset)
  4. abstract public mixed offsetGet(mixed $offset)
  5. abstract public void offsetSet(mixed $offset, mixed $value)
  6. abstract public void offsetUnset(mixed $offset)
  7. }

 

ArrayAccess::offsetExists — 检查一个偏移位置是否存在
ArrayAccess::offsetGet — 获取一个偏移位置的值
ArrayAccess::offsetSet — 设置一个偏移位置的值
ArrayAccess::offsetUnset — 复位一个偏移位置的值

思考:
上面的四个接口方法分别有什么作用?在什么情况下会被调用?
如果不继承ArrayAccess接口,只是实现这四个方法还可以实现数组式访问的功能么?

例子:

  1. <?php
  2. class obj implements arrayaccess{
  3. private $container = array();
  4. public function __construct(){
  5. $this->container = array(
  6. "one" => 1,
  7. "two" => 2,
  8. "three" => 3,
  9. );
  10. }
  11. public function offsetSet($offset, $value){
  12. if(is_null($offset)){
  13. $this->container[] = $value;
  14. } else {
  15. $this->container[$offset] = $value;
  16. }
  17. }
  18. public function offsetExists($offset) {
  19. return isset($this->container[$offset]);
  20. }
  21. public function offsetUnset($offset) {
  22. unset($this->container[$offset]);
  23. }
  24. public function offsetGet($offset) {
  25. return isset($this->container[$offset]) ? $this->container[$offset] : null;
  26. }
  27. }
  28.  
  29. $obj = new obj;
  30. $obj[] = 'Append 1';
  31. $obj[] = 'Append 2';
  32. $obj[] = 'Append 3';
  33. print_r($obj);

 

数组key和value的限制条件

什么类型值可以当做数组的key,数组的value值又可以存什么类型?

  1. $array = [
  2. 1 => "a",
  3. "1" => "b",
  4. 1.5 => "c",
  5. true => "d",
  6. ];
  7. var_dump($array);
  8.  
  9. $array = [
  10. "foo" => "bar",
  11. "bar" => "foo",
  12. 100 => -100,
  13. -100 => 100,
  14. ];
  15. var_dump($array);

 

  • key可以使integer或者string
  • value可以使任意类型

key会有如下的强制转换:

  • 包含有合法整型值的字符串会被转换为整型
  • 浮点数和布尔值也会被转换为整型
  • 键名null实际会被存储为””
  • 数组和对象不能被用为键名
  • 相同键名,之前的会被覆盖

数组的访问

获取数组元素的值有哪些方法?
1.方括号,数组单元可以通过array[key]语法来访问
2.花括号也可以,例如$array[42] 和 $array{2} 效果相同。
3.方括号可以包括“表达式”,例如:$arr[somefunc($bar)];
4.自PHP5.4起可以用数组间接引用函数或方法调用的结果。

  1. function getArray() {
  2. return [1, 2, 3];
  3. }
  4.  
  5. $secondElement = getArray()[1];

 

数组元素的删除unset

unset()函数允许删除数组中的某个键。

  1. $array = [1, 2, 3, 4, 5];
  2. foreach($array as $key => $value) {
  3. unset($array[$key]);
  4. }
  5.  
  6. $array[] = 6;
  7. print_r($array);

注意:数组unset后,不会重建索引。

 

PHP数组类型与其他类型的转换

在PHP中,存在8中变量类型,分为三类

  • 标量类型:boolean、integer、float(double)、string
  • 复合类型:array,object
  • 特殊类型:resource、null

两个问题:
1.如何讲一个int、float、string、Boolean类型转换为数组?
2.var_dump((array)false)和var_dump((array)null)的输出结果是?

  • int,float,string,Boolean和resource类型(array)$scalarValue等同array($scalarValue)
  • object转换为array,结果为一个数组,其单元为该对象的属性,键名将为成员变量名
  • 将null转换为array会得到一个空的数组。
  1. class User{
  2. public $name = 'andy';
  3. public $age = 52;
  4. private $phone = '138xxxxxxxx';
  5. private $email = 'xxxx@gmail.com';
  6. protected $location = 'hongkong';
  7. }
  8. var_dump((array) new User());

 

数组的遍历

再来一个简单的问题
数组遍历的方式有哪些?

1.for: 语句循环遍历
2.foreach: 循环遍历
3.while:(list($key, $val) = each($fruit))
4.array_walk、array_map: 回调遍历
5.current和next: 内部指针遍历

array_walk与array_map有什么不同
array_walk引用的方式对数组进行遍历,返回值不重要
array_map为了改变数组的数据,支持多个数组数据合并,目的是返回新的数组。
walk和map的回调函数位置也不一样。

foreach和for性能对比
通过运行示例来体验性能的不同。
一般php推荐使用foreach来遍历数组。

foreach遍历中的顺序
看下面程序的执行结果

  1. $a = array();
  2. $a[2] = 3;
  3. $a[1] = 2;
  4. $a[0] = 1;
  5. foreach ($a as $v) {
  6. echo $v;
  7. }

 

foreach 来访问,是以什么顺序遍历呢?(通过介绍数组的内部结构进一步了解)

下面代码的执行结果是?

  1. $arr = array(1, 2, 3);
  2. foreach($arr as &$v){}
  3. foreach($arr as $v){
  4. echo $v;
  5. }

 

分解:

  1. $arr = array(1, 2, 3);
  2. foreach($arr as &$v){}
  3. echo $v;
  4.  
  5. $arr = array(1, 2, 3);
  6. foreach($arr as &$v){}
  7. echo $v;
  8. foreach($arr as $b) {
  9. echo $v;
  10. }

 

waring: 数组最后一个元素的$value引用在foreach循环之后仍会保留。建议使用 unset()来将其销毁。

foreach遍历中的引用分析

第一次foreach($arr as $k => &$v)
循环1:$v = &$arr[0] = 1;
循环2:$v = &$arr[1] = 2;
循环3:$v = &$arr[2] = 3;
第二次foreach($arr as $k => $v)
循环1:$v = &$arr[2] = arr[0] = 1;此时 $arr[2] = 1;
循环2:$v = &$arr[2] = arr[1] = 2; 此时 $arr[2] = 2
循环3:$v = &$arr[2] = arr[2] = 2;
此时 $arr = array(1, 2, 2);

PHP数组的内部实现

  • 实现数组使用了两个数据结构,一个是HashTable,另一个是bucket.
  • HashTable结构体用于保存整个数组需要的基本信息。
  • Buckey结构体用于保存具体的数据内容

什么是HashTable?
哈希表,是根据关键字(Key value)而直接访问在内存存储位置的数据结构。也就是说,它通过把键值通过一个函数的计算,映射到表中的一个位置来访问记录,这加快了查询速度。这个映射函数称作哈希函数,存放记录的数组称作哈希表。

哈希表
hash table,又叫哈希表,散列表,hash表。
这种数据结构通过key->value的映射关系,使得普通的查找和插入、删除操作都可以在O(1)的时间内完成。
key->value的映射是通过hash函数来实现的。

PHP数组Hashtable结构体

  1. typedef struct_hashtable{
  2. unit nTableSize; //hash buckey 的大小,最小为8,以2x曾铮。
  3. unit nTableMask; //nTableSize-1,索引取值的优化,193491849 & 127
  4. unit nNumOfElements; //hash Buckey 中当前存在的元素个数,count()函数会直接返回此值。
  5. ulong nNextFreeElement; //下一个数字索引的位置
  6. Bucket *plnternalPointer; //当前遍历的指针foreach比for快的原因之一,reset,current遍历函数使用
  7. Bucket *pListHead; //存储数组头元素指针
  8. Bucket *pListTail; //存储数组尾元素指针
  9. Bucket **arBuckets; //存储hash数组,实际的存储容器
  10. Unsigned char nApplyCount; //标记当前hash Bucket被递归访问的次数(防止多次递归)
  11. }HashTable;

Bucket结构体

  1. typedef struct bucket{
  2. ulong h; //对char *key进行hash后的值,或者是用户指定的数字索引值
  3. uint nKeyLength; //hash关键字的长度,如果数组索引为数字,此值为0
  4. void *pData; //指向value, 一般是用户数据的副本,如果是指针数据,则指向pDataPtr
  5. void *pDataPtr; //如果是指针数据,此值会指向真正的value,同事上面pData会指向此值
  6. struct bucket *pListNext; //整个hash表的下一元素
  7. struct bucket *pListLast; //整个hash表该元素的上一个元素
  8. struct bucket *pNext; //存放在同一个hash Bucket内的下一个元素
  9. struct bucekt *pLast; //同一个hash bucket的上一个元素
  10. const char *arKey; //保存当前key所对应的字符串值
  11. }Buckey;

数字索引
直接使用h作为hash值。
arKey = null 且 nKeyLength = 0

字符串索引(关联数组)
h则是该字符串通过hash函数计算后的hash值。
arKey保存字符串key,
nKeyLength 保存该key的长度

typedef struct_zend_hash_key{
const char *arKey;
uint nKeyLength;
ulong h;
}zend_hash_key;

在PHP数组中,如果索引字符串可以被转换成数字,也会被转换成数字索引。
所以在PHP中例如‘10’, ‘11’这类的字符做阴和数字索引10,11没有区别。

HashTable扩容
HashTalbe的大小并不是固定不变的,当nNumOfElements > nTableSize时,会对HashTable进行扩容,以便于容纳更多的元素。
扩容之后需要对原来hashTable的元素rehash.

  1. <?php
  2. $a = [];
  3. $p = (1 << 14) -1; //每一次移动都表示"乘以2"
  4. $b = 1;
  5. for ($i = 0; $i < $p; $i++) {
  6. $a[] = $b;
  7. }
  8. echo memory_get_usage(true)."\n";
  9. $a['as1'] = 1;
  10. echo memory_get_usage(true)."\n";
  11. $a['as2'] = 1;
  12. echo memory_get_usage(true)."\n";

PHP数组排序的原理

由于数组排序并不会改变数组中的元素,而只是改变了数组中元素的位置,因而,对底层而言,实际上只是对全局的双链表进行排序。
1.申请n个额外的空间(n是数组元素个数)
2.然后遍历双链表,将双链表的每个节点存储到临时空间
3.调用排序函数zend_qsort(内部是快速排序算法)对数组进行排序
4.排序之后,双链表中节点的位置发生了变化,因而需要调整指针的指向。
5.遍历数组,分表设置每一个及节点的pListLast和pListNext
6.最后设置HashTable的pListTail

PHP位运算

判断int型变量a是奇数还是偶数:a&1 = 0偶数 a&1 = 1 奇数
乘法运算转化成位运算:a*(2^n)等价于 a<<n
出发运算转化成位运算:a/(2^n)等价于a>>n
不同temp交换两个整数 x^=y;y^=x;x^=y;
二进制位掩码,提供了一种用一个选项表示多项的可能。(参考:error_reporting设置错误级别的方式)

思考:下面两种写法的含义
error_reporting(E_ERROR|E_WARNING|E_PARSE|E_NOTICE);
error_reporting(E_ALL ^ E_NOTICE);

输入流php://input
$_POST vs php://input
①仅在取值为application/x-www-data-urlencoded和multipart/form-data时,PHP会将http请求body响应数据会填入到数组$_POST,填入到$_POST数组中的数据是进行urldecode()解析的结果。
②只要Content-Type不为multipart/form-data,php://input会填入post数据。
③仅当Content-Type为application/x-www-form-urlencoded且提交方法是POST方法时,$_POST数据与php://input数据才是一致的

$HTTP_RAW_POST_DATA VS php://input
php://input可以读取没有处理过的POST数据。相较于$HTTP_RAW_POST_DATA而言,它给内存到来的压力较小。
This feature has been DEFRECATED as of PHP 5.6.0.

数组与数据结构

数组和数据结构之“链表”
链表能存储多个数据元素,他就像一条线一样,把所有存储的数据元素连在一起,所以也称作是线性的数据结构。

数组和数据结构之“散列表”
散列表(Hash table,也叫哈希表),是根据关键字(key value)而直接访问在内存存储位置的一种数据结构。

数组和数据结构之“栈”
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进先出的原则存储数据(LIFO,Last In First Out)。

数组实现“栈”的核心操作
$stack = array(34, 35, 321, 98, 20);
$item = array_pop($stack);//出栈
array_push($stack, $item); //入栈

数组和数据结构之“队列”
队列就是先进先出(FIFO,First-In-First-Out)的线性表。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。

数组实现“队列”的核心操作
$queue = array(2, 3, 4, 5, 6);
array_push($queue, 7); //入队列
$item = array_shift($queue);//出队列

PHP数组解决“约瑟夫环”问题
一群猴子排成一圈,按1,2,…n依次编号。然后从第一只开始数,疏导第m只,把它踢出圈,从它后面再开始数,再数到第m只,再把它踢出去…,如此不停的进行下去,直到只剩下一只猴子为止,那只猴子就叫做大王。
要求编程模拟此过程,输入m、n,输出之后那个大王的编号。

  1. <?php
  2. //php有非常完善的数据结构模拟方案,可以非常简洁的解决这样的问题
  3. function king($n, $m)
  4. {
  5. $monkey = range(1, $n); //模拟建立一个连续数组
  6. $i = 0;
  7. while(count($monkey) > 1) {
  8. $i++;//开始查数
  9. $head = array_shift($monkey);//直接一个一个出列最前面的猴子
  10. if ($i % $m != 0) {
  11. array_push($monkey, $head);//如果么有数到m或m的倍数,则把该候放回尾部去。
  12. } //否则就抛弃掉了
  13. }
  14. return $monkey[0];
  15. }
  16.  
  17. echo '剩余', king(6, 9), '号猴子';

一条评论

  1. 水果一件代发 2019年6月27日 下午6:31 回复

    技术很好

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Go