0%

PHP函数及其使用

有容乃大,无欲则刚,容是别人,欲是自己。 —— 《士兵突击》

一、数组函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
>>>>>>>>>>>array_chunk
1. 功能:将一个数组分割成多个。
2. 用法:`array_chunk(array $array, int $size[, bool $preserve_keys = false ]):array`
3. 说明: 将一个数组分割成多个数组,其中每个数组的单元数目由 size 决定,最后一个数组的单元数目可能会少于 size 个。
4. 参数
* array:需要操作的数组
* size:每个数组的单元数目
* preserve_keys:设为 TRUE,可以使 PHP 保留输入数组中原来的键名。如果你指定了 FALSE,那每个结果数组将用从零开始的新数字索引。
* 默认值是 FALSE。

#索引数组
$input_array = array('a', 'b', 'c', 'd', 'e');
print_r(array_chunk($input_array, 2));#第三个参数默认
print_r(array_chunk($input_array, 2, true));#第三个参数指定为true

#关联数组
$input_array = array('a'=>'a', 'b'=>'b', 'c'=>'c', 'd'=>'d', 'e'=>'e');
print_r(array_chunk($input_array, 2));
print_r(array_chunk($input_array, 2, true));

>>>>>>>>>>>array_column
1. 功能:返回数组中指定的一列
2. 用法:`array_column(array $input, mixed $column_key[, mixed $index_key = null ]):array`
3. 说明:返回input数组中键值为column_key的列,如果指定了可选参数index_key,那么input数组中的这一列的值将作为返回数组中对应值的键。
4. 参数
* input:需要取出数组列的多维数组。 如果提供的是包含一组对象的数组,只有 public 属性会被直接取出。 为了也能取出 private 和 protected 属性,类必须实现 __get() 和 __isset() 魔术方法。
* column_key:需要返回值的列,它可以是索引数组的列索引,或者是关联数组的列的键,也可以是属性名。**也可以是NULL,此时将返回整个数组(配合index_key参数来重置数组键的时候,非常管用)**
* index_key:作为返回数组的索引/键的列,它可以是该列的整数索引,或者字符串键值。

#取某个字段形成新数组
$records = array(
array(
'id' => 2135,
'first_name' => 'John',
'last_name' => 'Doe',
),
array(
'id' => 3245,
'first_name' => 'Sally',
'last_name' => 'Smith',
),
array(
'id' => 5342,
'first_name' => 'Jane',
'last_name' => 'Jones',
),
array(
'id' => 5623,
'first_name' => 'Peter',
'last_name' => 'Doe',
)
);
$first_names = array_column($records, 'first_name');
print_r($first_names);

#指定数组下标
$id_names = array_column($records, 'first_name', 'id');
print_r($id_names);


#结合array_combine一起使用
$arr = [
[
'id' => 123,
'name' => 'test',
'age' => 10,
'created' => '2019-07-03 12:12:12'
],
[
'id' => 456,
'name' => 'test1',
'age' => 10,
'created' => '2019-07-03 12:12:12'
],
[
'id' => 789,
'name' => 'test2',
'age' => 10,
'created' => '2019-07-03 12:12:12'
],
];

$id = array_column($arr,'id');
$new = array_combine($id, $arr);
print_r($new);

#神来之笔,同demo3

$arr = [
[
'id' => 123,
'name' => 'test',
'age' => 10,
'created' => '2019-07-03 12:12:12'
],
[
'id' => 456,
'name' => 'test1',
'age' => 10,
'created' => '2019-07-03 12:12:12'
],
[
'id' => 789,
'name' => 'test2',
'age' => 10,
'created' => '2019-07-03 12:12:12'
],
];
$tmp = array_column($arr, null, 'id');
print_r($tmp);

>>>>>>>>>>>array_combine
$a = array(
'onekey1' => 'onevalue1',
'onekey2' => 'onevalue2',
'onekey3' => 'onevalue3'
);
$b = array(
'twokey1' => 'twovalue1',
'twokey2' => 'twovalue2',
'twokey3' => 'twovalue3'
);
$c = array_combine($a, $b);
print_r($c);

$season = [
['id' => 'aaa', 'name' => '春季', 'sequence' => 1],
['id' => 'bbb', 'name' => '暑假', 'sequence' => 2],
['id' => 'ccc', 'name' => '秋季', 'sequence' => 3],
['id' => 'ddd', 'name' => '寒假', 'sequence' => 4],
];
print_r($season);
#取$season的id组成新数组$season_id

$season_id = array_column($season, 'id');
print_r($season_id);

$new_season = array_combine($season_id, $season);
print_r($new_season);


>>>>>>>>>>>array_flip(array $array):array
1. 将数组的键值互换并返回反转后的数组
* array中的值需要能够作为合法的键名(例如需要是`integer`或者 `string`)。
* 如果类型不对,将出现一个警告,并且有问题的键/值对将不会出现在结果里。
* 如果同一个值出现多次,则最后一个键名将作为它的值,其它键会被丢弃。

#值为null
$arr = [
'one' => 'a',
'two' => null
];
$res = array_flip($arr);
print_r($res);
输出:Warning: array_flip(): Can only flip STRING and INTEGER values! in xxx

#值为string
$arr = [
'one' => 'a',
'two' => 'null'
];
$res = array_flip($arr);

>>>>>>>>>>>array_map
1. 语法:`array_map(callable $callback, array $array1[, array $... ]):array`
* callback:回调函数,应用到每个数组里的每个元素。
* array1:数组,遍历运行 callback 函数。
2. 作用:为数组的每个元素应用回调函数

#金钱以千分位分隔符隔开,保留小数点后两位
$num = [1, 3, 4.5, 5.4, 8.11111];
$one = array_map('number_format', $num, [2, 2, 2, 2, 2]);
$two = array_map(function ($value) {
return number_format($value, 2);
}, $num);
function test($data,$len = 4) {
return number_format($data, $len);
}
$three = array_map('test', $num);
$len = 2;
$four = array_map(function($value) use ($len) {
return number_format($value, $len);
}, $num);

foreach($num as $k => $v) {
$five[] = number_format($v, 2);
}

#数据类型转换
$data = ['a' => 1, 'b' => 2];
var_dump($data);
array_map(function ($v) {return (string)$v;}, $data);
var_dump($data);
foreach ($data as $k => $v) {
$data[$k] = (string)$v;
}
var_dump($data);

>>>>>>>>>>>array_merge
1. 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面,返回作为结果的数组。
* 如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值
* 然而如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。
* 如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。

#合并两个数组,后面数组中的值附加在前面数组的后面
##混合数组
$a = array(1, 'a' => '2', 4);
$b = array(1, 'a' => '3', 5);
print_r(array_merge($a, $b));
输出:
Array
(
[0] => 1
[a] => 3
[1] => 4
[2] => 1
[3] => 5
)
print_r($a + $b);
输出:
Array
(
[0] => 1
[a] => 2
[1] => 4
)

##索引数组
$arr1 = [1,2,3];
$arr2 = [1,4,5];
print_r(array_merge);
输出:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 1
[4] => 4
[5] => 5
)
print_r($arr1 + $arr2);
输出:
Array
(
[0] => 1
[1] => 2
[2] => 3
)

#重新索引索引数组的下标,关联数组无变化
## 情形一、索引数组重新索引
$a = array(
1 => 3,
'a' => array( 'c' => 3)
);
print_r(array_merge($a));
输出:
Array
(
[0] => 3
[a] => Array
(
[c] => 3
)
)
## 情形二、关联数组无变化
$a = array(
'b' => 3,
'a' => array('c' => 3)
);
print_r(array_merge($a));
输出:
Array
(
[b] => 3
[a] => Array
(
[c] => 3
)
)

## 情形三、索引数组键名相同
$a = array( 1 => 3, 1 => 'aa');
print_r(array_merge($a));
输出:
Array
(
[0] => aa
)

## 情形四、关联数组键名相同
$a = array( 'a' => 3, 'a' => 'aa');
print_r(array_merge($a));
输出:
Array
(
[a] => aa
)

>>>>>>>>>>>array_reduce
1. `array_reduce(array $array, callable $callback[, mixed $initial = NULL ]):mixed`,将回调函数callback迭代地作用到array数组中的每一个单元中,从而将数组简化为单一的值。

#树状结构合并为一维数组
$str = '{"department":{"05f1a4c91ef77c001424f0c587079ff7":["be18576d271e945a42caf90abf9e9917","00f721589af54c0bad38461527b7baa3"],"65fd7303b005f401b2420b54c981bddf":["e24c06ee5eed4124925521304999cabe","88f54bd22293bff0472c8d58823334fe"],"b0c11f49d96671c6cce192db6a71c14a":["c9cc49492421fdab3fc09eab5e2cc458"],"e70f902e33a71bc21281204405fefcdb":["abf1a042b6648ab481a40581619f65a3","d88675f4bdad473db63cd068108059ce","f76128fad970474a8efba2d98d890d72","ad2fa5178a72cead089e50e3b794748e","83f4e6e48882b32531ed8ff0e19cc329","c44ffdd7bce30684c39cf20d6e8be9ca","08951a0cedb9a54a67bed7cfdee597bb","f5932a8aeb99c0582006372cfd64c5f1","20fa40645f5cb64bfe53f5ebdda5ff65","8ac3ac731e0a5bc5ac19bc0af476a9cf","a66fa40b6a7af410877537bf65d27213","2a64ae8188e57ec1c156bb9641fb06e6","fbafc8faf75f19cbd612ea380fcf2bfb","cc500b7657d8d2ce2ded43f9e51c8756","92ae9a79300956a928047977c5f80e9b","d3935bdb80aa134e65e71f48b0385fc2","3af3fb418fbd539b05190a4ba3d46e66","04e8912d5c23ddacbea2b25d65b6402a","dc6d9d20889f210d7ca320f16b6f64b1","05cb588367917b56f892b016a53ee5a3","79e0c11706e748329f4fcc83ed861a38","d52177c64c57d69be7f108be9331f647","36c038780b8be0e4ecf58e161b4cd6b3","26112e2bccdd433f068c264f58ea49ee","3ef8afd46dcfebe8201bb4a6a9dddf5e","81a8e88121384206dcce7832e2ab2005","46c9af7f3fc496cbbb30e9c4c2a6cfac","e54c2d42fb430c695e13f9212eb079e6","32c0eb23f9ff1150f61c81e847590a29"],"eaefdb7f8ed5b8d27b3c7c55e9537e38":["b4f8ba4c3d9c4035be30e3aa3e4332a9","6cee088e8f61457f915698cf2e35bf02","caee10803879471b98081d1569a94caf"]},"category":{"355368f0ad814ba3a8366d15bc42dee0":{"23592bd68289488495014b95b46d7624":["0b894a8c700d43028b10104c0f22ddcf","8c333c275b684419a4523ffdad72e7a8"]},"54a5fc4fee654d5ca1276ebfee2ba533":{"6fe77674e4d74eab87726289e8b8069f":["ced560d54e3142b1a473c060693387c6"]},"68e6de61d7c040ac9d8c22674be683fb":{"472bc6b0a1bf4c27afa9d04f06c51677":["113e35415e8744b687b7552fe094d0e9","1ba6c3d9b20d4cf8b8824ed0e3cc4a7d","47b900f5d6f547a6b5b0bfb0664b2dbe","6949537769674595927c77d5aabb5aaa","78b9e482d4f549e2aacbabb1ca8107cb","804e62e92d4f4d30af38ec8079f18dbc"],"56c3633b2728481981ae790a4de8ee60":["3231d4e30db3456695996cde28229a25","50e3cdb16e3c42779bd0b108c54e0d23","5a2fbd08a3554c40a8774e401059beb5","8344350ecf1648c485f8d1547f500ff5","9f8946b1e5e34574a35510c5a000462b","bdbfbc203e104a62a6e0fc2acfda9c9e"],"6caa57943cc6486aabe8b89f3cc0aa8a":["177a9d2a5f9c4dd991371cf28458d79c","89b5f65c0ad3452a85ce2237bbbfe4e5","bd700b119c744b81a51410e7eb6c48b9","bdf3b16826a243d8b5288460591751a5","c7cc9eb68ba441068c7523aa26fc2a8f","e428da54fcb9405bac6a3781a3263c00"],"cd22cad3245a4b7f951b93a3529e9f19":["2583fa83855648e39b73756eb886e056","52edc4b74d084be484a3b4af9b7d9b63","5fd41cd95db24868a7ee0b31f59a4c52","e83b305707704f13804f7a9872789328","e90a51b2f6bd4b39a03a45c30868da26","ff4eadce871848479aeac2414e96393c"],"d8a387406e56470f90314b6a8b1745a1":["276f4a6b652f4fc097eca87deebc47ef","3cf17e73193140cbb26167ff19088668","ad1b9b8a9757469dbe3caa5b3666e7c8","aef36aa21492421dbe78577c3c8490a8","b4d9e5364bcb4b65a72de5b7c5212fcd","df9bd01c87af4941b90164f0505a2839"],"fa79ebafd195480fa5828c19f3246a44":["0e4d949154af47d2a561c2505f1f9022","2a0d5edab20b40e983bfdb5e689c2570","690fbc43680341df8fc0d5d65d26c685","77d7ad9d9c624846acd67fd1895bfb15","f2af9410efcd4b3baf1d19570582b3c2","f4405453e9f143fcb7f2f843b08c457a"]},"8c44d1e8d0584ce9a2297b844ea96c9f":{"049651f9031449bca76d116e422a2cbf":["0987adeaecb64fc18f0e4a1737c6fddf","19a71573a8fd4de9b5f8dbc3fa51cc95","24349ad5df0f4efaaaa84a34a301a598","39772a3d09d84f7c820434c6c2a68eab","3e29d4194d1741d4adb291706d98feb4","6a331b2cdde845f287db80d7819c1e66","7614213bec6b489d842127500853fa73","7b99640b101c4059982c95a0b6c2fbee","c2512cb0e51d47918d9e9d1ad18926f9","e3a8e8f69abd41b488c3a8b2537397d2","ed1cbafc7f664b73ae2bfa5ce46eda24"],"70d0dd1057c847208871ea1e8c3a67cc":["0e8901d058c548f5ad2fc2346919d040","15b9bd54e6fc46b99d75341673f57515","1b297cbb12ec4bedaf57fa30d3a35373","3f6e7ac306e7481cae8a3cf8d4261d56","44742a5415664f1ab11830d607000e63","6eb649d8ecfc4ba3beb8bd57603cbe42","9a63d939bf16403f901cd8a9aca54863","cb2d7caf8c904f1facb328892b976f28","cc0e0f540a0246de82c3912a456c5ad7","edb8b8ec3fcd42edb71ff3faf9907d40","f50f346a79094d37b7d6360d3964f688"],"9ee5a06ce1324f2994b20b19f072b58b":["0a2d1a5cac8e43cd820a0529e89e45a8","5958bf22316440d0b071ee61215a15f3","5a4c6376c8f7463bae19c737ca009768","5bc74976a03547fc91c6a1834fdc0814","676afcfbfe1c40a993b9f5d68b01c2bb","6cc992d8ed084ebe80e679f6d0f1f63f","90b19d2263b64fc5a06c2c24189c3f66","a78bad51d9624f168f92341b47ff25db","ccd36fe7023644c092dd7d1de494bba9","dc8d31100122455c94383b6386ba1849","f60397f21440423e96aa66ab724fcf91"]},"8d0d9bffe18b48e6bdcb7a98a0e03ee1":{"58d5c2ada9124305a676913a8a03bb3f":["047d5b99412247099cf2b6e25f3cbeca","0d576c7bfb054a5c83b1438dfc27a056","1e4ead73539e4bbca160b2153f8045b8","2086d145185e44f0ba5d69c92eedd8a5","2b137611a1d3477cb7fa442e46d875eb","352df502a82d40529923f83803384a77","4b2bc253e71c4237a02425c7ecda5fa9","56c906d5acdc4de6a520056457af15dd","5da3a89090684e29bd2e9e4cd710adf5","96d85168ce2141f2b230d19e094c170c","9b1c459989714dc2b88cdeed9d3f08f1","9fb2f9ed56804a72b90532ce4a11a8ec","add8e47bb2f248cdbe691d673131b7db","b81aa2c66b7d46e1aa1d444a0f1c3ef7","c556721dc58c43a785a216fa299e85fa","de8141d583d6446e94b20e2e1f6dcaf1"],"97df4652ee0e4d1b8bd886d73890fb61":["1c7c8d3ee2bb4334b36c88b33240754d","8397d5a30cf447e7a390a1ac1eb1ff59","85c77eb145e9449db05bd740880af19a","9505bce89b8c429b9eac083725351b49","96b1cb77cfc74200a0fd5c7735764791"],"bd02671df27643bbafc51069cee1f230":["02c05a3c815a4456abfa18ab2c6c8af7","4435226714864fe8894236660cb27594","459fabcd15de4e279cb19dc7ab316545","54054cb30ab149f3a9480514f4d67911","79298623a63a4f728840aa94fbad4f42","a3cc6d610eb44c37956e0fba1c5615cd","a82f335455eb43dcbc7541ea05261c44","d8849854300542628b00758e23a00f3f","e3b448ce588643d6910f453554fafd2a","eab920f6e9f643f4bac5fdd1fc11f6a6","efd3d1ab80ef4b4bbcee12d5d9bad42c"]},"9f219946df4f4336946579b89cfbfe7e":{"c470eae33bdf4d9a95b492322a9cab88":["4c762ca56977422fab22a15ea3be1bdc"],"df1f542e44744023a44cdc5fc871258f":["03538fc829814f39aa1f67a15263ae85","04d8d325576e4cf585bbe67485554762","16e195e1370e42efa52ab7e2afee9770","2236742961b74ec5b33ea7c2398091fe","38de905eae2449cc9d2d12011366acd7","92daf2b6a17b4493af8cb6bfa0e01270","d72a56bf64dd4bbf8b0b6f7c9b437888"]},"aa59ad1f470742fc99c8acdac5b3acf0":{"7ce3b9b92c5b464aaa219c6772deb3c4":[""],"b5641323a977486ebc94ef97a6b01b67":[""]},"ddce280fb06a461680863ca9b2ca7412":{"2c69cb34dce1469b96773d1e2d0f72ed":["0e57fb961455429799a237b8ab7ad36e","5cced7cffa39449899bfcc5c768ee67d","8c1b2ccf81b14e39b9fe7b69391296ba","dbd6945f6d7c4af0a6cd66101a9d2e27","fd1a8aee5b4846b0853a3ddd355a2089"],"35f3fd424ab84283b172c18c04116888":["0fb3bed41fa24c959937daa40c0591a0","676c7d63f70c4797a6fd053f6ca4483d","7eaf89fb8ff147d0baa635d0780c6d7d","8713d76160a74cc187a3384a25f5a1c4","97d1274bddf746d599e9a916643f58c0","9b330bb14bb149ca8522980c7855aad8","9e15a143006c420481356ff380c5d1ae","ad16ee81d0cc49f2b514ed0cc6224d6b","c5c07d858bdb41a7b36ba8d21e14f69e"],"4b50d1f2c7e94f0c99d5d38b79c1fe73":["3cabed9e4fc0451ea9378405fcc102b9","50e3b78b6f9a48f69b151798b2092378","7c57ea1d124a4b95b401b8a6cc17cbd2","8372c95b3c5f4cf0b32f9560d77d65f9","acba29a1aae543549d0b9e7209939ad3","bb5ce1d966ba450fb2459186c05d8623","da0e715ebc934fcaad6d04e2d51063bd"],"7f8e49afa4b844ce83faf56c7ede6cdf":["92070c70e4e84e42867cab6a995f04d9"],"8a631a6a2f9c461292016f13c3712879":["a9d469b916b64c67b3c3e0c484755dd1","d49dd3018b7349549c0ba830f19fad8b"],"c4969db58b914f548264bda4c3c45c9a":["104cdf825a574f5f8263f261f8429fdb","11d661c6c73047108da2e7f050a3e1ba","1abe94a9de3c405b9951fb3f9c4773fe","21ba7a4a9a3b40c8b3528c34598ddf18","40683b4c82114f26ae6a0776163c9678","42e750525e6943b1bd20a9806fa6ea62","47b061e862d04b5288e177774bc37c92","50aa3cbd206945618b1db7150a3c72fe","561d81fac6bc4daf9154617afd6f22a3","5a8053db41464580ab45679957d9d062","858677536b16480093efd92f54171737","861784fde4774def9e2348df12f37711","f6e3d898d9ad44ec8adf1032200b2312"],"f02e85199e1f4861b2722dbdff079407":["060d68731e5441b69c6a564ceb7dbc31","0681be33003a4b3483a6d29581425338","15ea6e126355407b8e79b6bfc484cc80","1a7af252561049db82d7b277098aa340","60896a10f56b4ee5806cf4988b86bfd4","631cda1cf9134b02865241fd4c730c3f","7fc62475f27142799ab1a2048d7cca08","a504c327ee7140e5ae497dfa40517eac","a55ce4f15a7844c5bda4812db67c4c9b","a9aa2194faa64327bc65bda42d25c8c6","e9b41b85b40e4d01bbec5c0dacb9bf0e"]}},"join_merchant":["e5870db2d6324594a6c2c73b80cf5e73"],"pool_merchant":["4f1dc462a4814991a8145139925e2282","374951c1b7f9488b8ac563a54ee41244"]}';
$array = json_decode($str, 1);
$array = $array['department'];
$arr = array_reduce($array, 'array_merge', []);
print_r($arr);

>>>>>>>>>>>array_slice
1. 功能:从数组中取出一段
2. 用法:`array_slice(array $array , int $offset [, int $length = NULL [, bool $preserve_keys = false ]]):array`
3. 说明:返回根据`offset`和`length`参数所指定的`array`数组中的一段序列。
4. 参数
* array:输入的数组。
* offset:
* 如果`offset`非负,则序列将从`array`中的此偏移量开始。
* 如果`offset`为负,则序列将从`array`中距离末端这么远的地方开始。
* length:
* 如果给出了`length`并且为正,则序列中将具有这么多的单元。
* 如果给出了`length`并且为负,则序列将终止在距离数组末端这么远的地方。
* 如果省略,则序列将从`offset`开始一直到`array`的末端。
* preserve_keys:注意`array_slice()`默认会重新排序并重置数组的数字索引。你可以通过将`preserve_keys`设为`TRUE`来改变此行为。
5. 注意事项
* 如果`offset`参数大于`array`尺寸,就会返回空的`array`

$input = array("a", "b", "c", "d", "e");
$output = array_slice($input, 2); // returns "c", "d", and "e"
$output = array_slice($input, -2, 1); // returns "d"
$output = array_slice($input, 0, 3); // returns "a", "b", and "c"
// note the differences in the array keys
print_r(array_slice($input, 2, -1));
print_r(array_slice($input, 2, -1, true));


>>>>>>>>>>>array_splice
1. 功能: 去掉数组中的某一部分并用其它值取代
2. 用法:`array_splice(array &$input, int $offset[, int $length = count($input)[, mixed $replacement = array()]]):array`
3. 说明: 把`input`数组中由`offset`和`length`指定的单元去掉,如果提供了`replacement`参数,则用其中的单元取代。
* 注意`input`中的数字键名不被保留
* `input`传引用方式
4. 参数
* input:输入的数组,传引用。
* offset:
* 如果`offset`为正,则从`input`数组中该值指定的偏移量开始移除。
* 如果`offset`为负,则从`input`末尾倒数该值指定的偏移量开始移除。
* length:
* 如果省略`length`,则移除数组中从`offset`到结尾的所有部分。
* 如果指定了`length`并且为正值,则移除这么多单元。
* 如果指定了`length`并且为负值,则移除从`offset`到数组末尾倒数`length`为止中间所有的单元。
* 如果设置了`length`为零,不会移除单元。
* 小窍门:当给出了`replacement`时要移除从`offset`到数组末尾所有单元时,用`count($input)`作为`length`。
* replacement
* 如果给出了`replacement`数组,则被移除的单元被此数组中的单元替代。
* 如果`offset`和`length`的组合结果是不会移除任何值,则`replacement`数组中的单元将被插入到`offset`指定的位置。
* 注意替换数组中的键名不保留。
* 如果用来替换`replacement`只有一个单元,那么不需要给它加上 array(),除非该单元本身就是一个数组、一个对象或者 NULL。

$input = array("red", "green", "blue", "yellow");
array_splice($input, 2); // $input is now array("red", "green")

$input = array("red", "green", "blue", "yellow");
array_splice($input, 1, -1); // $input is now array("red", "yellow")

$input = array("red", "green", "blue", "yellow");
array_splice($input, 1, count($input), "orange"); // $input is now array("red", "orange")

$input = array("red", "green", "blue", "yellow");
array_splice($input, -1, 1, array("black", "maroon")); // $input is now array("red", "green","blue", "black", "maroon")

$input = array("red", "green", "blue", "yellow");
array_splice($input, 3, 0, "purple"); // $input is now array("red", "green","blue", "purple", "yellow");

$input = array("red", "green", "blue", "yellow");
array_splice($input, 3, 1, "purple"); // $input is now array("red", "green","blue", "purple");

>>>>>>>>>>>数组和json转换
$arr = array('name'=> 'liuyulong','sex'=>'man','weight'=>'80kg');
$json = json_encode($arr);
print_r($json);

#多维数组
$arr = array(
'first'=>array('name'=>'liuyulong','sex'=>'man','weight' =>'80kg'),
'second'=>array('name'=>'liusirdotme','sex'=>'man','weight'=>'80kg'),
);
$json = json_encode($arr);
print_r($json);

#一维数组
$arr = array('liuyulong','man','80kg');
$json = json_encode($arr);
print_r($json);

#多维数组
$arr = array(
array('liuyulong','man','80kg'),
array('liusirdotme','man','80kg'),
);
$json = json_encode($arr);
print_r($json);


#索引+关联
$arr = array(
array('name'=>'liuyulong','sex'=>'man','weight'=>'80kg'),
array('name'=>'liusirdotme','sex'=>'man','weight'=>'80kg'),
);
$json = json_encode($arr);
print_r($json);

#关联+索引
$arr = array(
"first" => array('liuyulong','man','80kg'),
"second" => array('liusirdotme','man','80kg'),
);
$json = json_encode($arr);
print_r($json);


>>>>>>>>>>>call_user_func
1. 语法 `call_user_func(callable $callback[, mixed $parameter[, mixed $... ]]):mixed
2. 说明:把第一个参数作为回调函数调用
* 第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数

function increment(&$var){
$var++;
}
$a = 0;
$b = &$a;
call_user_func('increment', $b);
echo $a;
输出:0
call_user_func_array('increment', array(&$a));
echo $a;
>传入call_user_func()的参数不能为引用传递。

>>>>>>>>>>>call_user_func_array
1. 语法 `call_user_func_array(callable $callback, array $param_arr):mixed`
2. 说明:调用回调函数,并把一个数组参数作为回调函数的参数
* 参数:第一个参数作为回调函数调用,把参数数组作为回调函数的的参数传入
* 参数数组得是索引数组
* 返回值:正常返回回调函数的结果,出错的话就返回FALSE

#直接调用函数
function func($arg, $arg2, $arg3 = 3) {
echo __FUNCTION__, " 拿到参数 $arg 和 $arg2 和 $arg3 \n";
}
call_user_func_array("func", [1, 2]);

#调用对象的方法
class Test {
function method($arg, $arg2) {
echo __METHOD__, " 拿到参数 $arg 和 $arg2\n";
}
}
//调用类的方法
$test = new Test();
call_user_func_array(array($test, "method"), [3, 4]);

#对比
>call_user_func可以传一个参数,也可传多个,跟回调函数的参数有关,call_user_func_array只有2个参数,必须传2个参数
>call_user_func传的参数是字符串形式,call_user_func_array传的参数是数组形式
>call_user_func不能引用传递传参数,call_user_func_array允许引用传递
>性能上call_user_func比call_user_func_array快

二、字符串函数

  1. addcslashes:以 C 语言风格使用反斜线转义字符串中的字符
  2. addslashes:使用反斜线引用字符串
  3. stripcslashes:反引用一个使用 addcslashes() 转义的字符串
  4. stripslashes:反引用一个引用字符串
  5. bin2hex:函数把包含数据的二进制字符串转换为十六进制值
  6. hex2bin:转换十六进制字符串为二进制字符串
  7. chr:返回指定的字符
  8. chunk_​split:将字符串分割成小块
  9. convert_​cyr_​string:将字符由一种 Cyrillic 字符转换成另一种
  10. convert_​uudecode:解码一个 uuencode 编码的字符串
  11. convert_​uuencode:使用 uuencode 编码一个字符串
  12. count_​chars:返回字符串所用字符的信
  13. crc32:计算一个字符串的 crc32 多项式
  14. crypt:单向字符串散列
  15. echo:输出一个或多个字符串
  16. fprintf:将格式化后的字符串写入到流
  17. get_​html_​translation_​table:返回使用 htmlspecialchars() 和 htmlentities() 后的转换表
  18. hebrev:将逻辑顺序希伯来文(logical-Hebrew)转换为视觉顺序希伯来文(visual-Hebrew)
  19. hebrevc:将逻辑顺序希伯来文(logical-Hebrew)转换为视觉顺序希伯来文(visual-Hebrew),并且转换换行符
  20. html_​entity_​decode:Convert HTML entities to their corresponding characters
  21. htmlentities:将字符转换为 HTML 转义字符
  22. htmlspecialchars_​decode:将特殊的 HTML 实体转换回普通字符
  23. htmlspecialchars:将特殊字符转换为 HTML 实体
  24. explode:使用一个字符串分割另一个字符串
  25. implode:将一个一维数组的值转化为字符串
  26. join:别名 implode()
  27. lcfirst:使一个字符串的第一个字符小写
  28. ucfirst:将字符串的首字母转换为大写
  29. ucwords:将字符串中每个单词的首字母转换为大写
  30. strtolower:将字符串转化为小写
  31. strtoupper:将字符串转化为大写
  32. levenshtein:计算两个字符串之间的编辑距离
  33. localeconv:Get numeric formatting information
  34. trim:去除字符串首尾处的空白字符(或者其他字符)
  35. ltrim:删除字符串开头的空白字符(或其他字符)
  36. rtrim:删除字符串末端的空白字符(或者其他字符)
  37. chop:rtrim() 的别名
  38. md5_​file:计算指定文件的 MD5 散列值
  39. md5:计算字符串的 MD5 散列值
  40. metaphone:Calculate the metaphone key of a string
  41. money_​format:将数字格式化成货币字符串
  42. nl_​langinfo:Query language and locale information
  43. nl2br:在字符串所有新行之前插入 HTML 换行标记
  44. number_​format:以千位分隔符方式格式化一个数字
  45. ord:转换字符串第一个字节为 0-255 之间的值
  46. parse_​str:将字符串解析成多个变量
  47. print:输出字符串
  48. printf:输出格式化字符串
  49. quoted_​printable_​decode:将 quoted-printable 字符串转换为 8-bit 字符串
  50. quoted_​printable_​encode:将 8-bit 字符串转换成 quoted-printable 字符串
  51. quotemeta:转义元字符集
  52. setlocale:设置地区信息
  53. sha1_​file:计算文件的 sha1 散列值
  54. sha1:计算字符串的 sha1 散列值
  55. similar_​text:计算两个字符串的相似度
  56. soundex:Calculate the soundex key of a string
  57. sprintf:Return a formatted string
  58. sscanf:根据指定格式解析输入的字符
  59. str_​getcsv:解析 CSV 字符串为一个数组
  60. str_​replace:子字符串替换
  61. str_​ireplace:str_replace() 的忽略大小写版本
  62. str_​pad:使用另一个字符串填充字符串为指定长度
  63. str_​repeat:重复一个字符串
  64. str_​rot13:对字符串执行 ROT13 转换
  65. str_​shuffle:随机打乱一个字符串
  66. str_​split:将字符串转换为数组
  67. str_​word_​count:返回字符串中单词的使用情况
  68. strcasecmp:二进制安全比较字符串(不区分大小写
  69. strchr:别名 strstr()
  70. strrchr:查找指定字符在字符串中的最后一次出现
  71. strstr:查找字符串的首次出现
  72. stristr:strstr() 函数的忽略大小写版本
  73. strcmp:二进制安全字符串比较
  74. strcoll:基于区域设置的字符串比较
  75. strcspn:获取不匹配遮罩的起始子字符串的长度
  76. strip_​tags:从字符串中去除 HTML 和 PHP 标记
  77. strpos:查找字符串首次出现的位置
  78. stripos:查找字符串首次出现的位置(不区分大小写)
  79. strripos:计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)
  80. strrpos:计算指定字符串在目标字符串中最后一次出现的位置
  81. strlen:获取字符串长度
  82. strnatcasecmp:使用“自然顺序”算法比较字符串(不区分大小写)
  83. strnatcmp:使用自然排序算法比较字符串
  84. strncasecmp:二进制安全比较字符串开头的若干个字符(不区分大小写)
  85. strncmp:二进制安全比较字符串开头的若干个字符
  86. strpbrk:在字符串中查找一组字符的任何一个字符
  87. strrev:反转字符串
  88. strspn:计算字符串中全部字符都存在于指定字符集合中的第一段子串的长度。
  89. strtok:标记分割字符串
  90. strtr:转换指定字符
  91. substr_​compare:二进制安全比较字符串(从偏移位置比较指定长度)
  92. substr_​count:计算字串出现的次数
  93. substr_​replace:替换字符串的子串
  94. substr:返回字符串的子串
  95. vfprintf:将格式化字符串写入流
  96. vprintf:输出格式化字符串
  97. vsprintf:返回格式化字符串
  98. wordwrap:打断字符串为指定数量的字串

三、ob函数

概念

  1. 当PHP脚本有输出时,输出控制函数可以用这些来控制输出。这在多种不同情况中非常有用,尤其是用来在脚本开始输出数据后,发送http头信息到浏览器。输出控制函数不影响由header()或setcookie()发送的文件头信息,仅影响像echo这样的函数和PHP代码块间的数据。

  2. 常用函数

函数名称 含义
ob_start(); 打开一个输出缓冲区,所有的输出信息不再直接发送到涉猎器,而是保存在输出缓冲区里面
ob_clean(); 删除内部缓冲区的内容,不关闭缓冲区(不输出)
ob_end_clean() 删除内部缓冲区的内容,关闭缓冲区(不输出)
ob_get_clean() 返回内部缓冲区的内容,关闭缓冲区。相当于执行ob_get_contents()和ob_end_clean()
flush(); 将ob_flush释放出来的内容,以及不在PHP缓冲区中的内容,整个输出至涉猎器;刷新内部缓冲区的内容,并输出
ob_flush(); 发送内部缓冲区的内容到涉猎器,删除缓冲区的内容,不关闭缓冲区
ob_end_flush() 发送内部缓冲区的内容到涉猎器,删除缓冲区的内容,关闭缓冲区
ob_get_flush() 返回内部缓冲区的内容,并关闭缓冲区,再释放缓冲区的内容。相当于ob_end_flush()并返回缓冲区内容
ob_get_contents() 返回缓冲区的内容,不输出
  1. 输出控制存在的意义:因为http协议的限制(前几行必须是协议信息,然后一个空行,然后才是用户需要的内容,需要保证header信息在其他内容之前发送,否则浏览器无法解析服务器返回的内容。

  2. demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#ob_start
echo "a";
ob_start();
echo 123;
sleep(5);
echo 456;
#结果:先输出a,然后过了5s,输出123456

#ob_end_flush与ob_flush
echo "a";
ob_start();
echo 123;
sleep(5);
ob_end_flush();
sleep(5);
echo 456;
sleep(5);
echo 789;

echo "a";
ob_start();
echo 123;
sleep(5);
ob_flush();
sleep(5);
echo 456;
sleep(5);
echo 789;
#ob_end_flush结果:先输出字符a,5s后输出123并输出缓冲区内容,清空缓冲区,再过5s后输出456,再过5s后输出789
#ob_flush结果:先输出字符a,5秒之后输出123并输出缓冲区内容,10s之后同时输出456 789

function ob_callback($string){
return $string.$string."\n";
}

ob_start("ob_callback");
echo 123;
sleep(5);
ob_flush();
sleep(5);
echo 456;
ob_flush();
sleep(5);
echo 789;
#结果:每隔5s依次输出123123、456456、789789,说明当调用ob_flush()之后会调用ob_callback()方法。

function ob_callback($string){
return $string.$string."\n";
}

ob_start("ob_callback",4);
echo 12345;
sleep(5);
ob_flush();
echo 456;
sleep(5);
ob_end_flush();
sleep(5);
echo 789;

#结果:立即输出1234512345,5s之后输出换行符(空字符),再过5s之后输出456456,再过5s输出789789。
#分析
* ob_start()的chunk_size=4,因为输出字符串12345长度已经超过了4,所以直接输出了,输出的时候调用了ob_callback()方法
* 过了5s后ob_flush()刷新缓冲区,此时缓冲区中的内容为空,所以执行ob_callback()的时候输出一个换行
* 接着执行echo 456;长度小于4,所以执行sleep(5)之后执行ob_end_flush(),刷新缓冲区并且执行ob_callback(),输出456456
* ob_end_flush()已经关闭了缓冲区,所以接下来过了5s之后输出789789

function outer($string){
return "out".$string;
}
function inner($string){
return "in".$string;
}

ob_start("outer");
echo "111";
ob_start("inner");
echo "222";
* 结果:out111in222

echo 'A';
ob_start();
echo 123;
ob_clean();

echo 'A';
ob_start();
echo 123;
ob_end_clean();

echo 'A';
ob_start();
echo 123;
echo ob_get_clean();
#结果:A、A、A123

四、常见函数对比

  1. 安全函数使用

    真题:怎么在代码类的网站存储类似的脚本<script>window.location.href='http://www.baidu.com'</script>

  • html_entity_decode
  • htmlentities
  • addslashes
  • stripslashes
  • htmlspecialchars
  • htmlspecialchars_decode
  • strip_tags
  1. isset-is_null-empty
  • 真题

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    $a = null;
    $b = 0;
    $c = '';

    var_dump(isset($a)); // bool(false)
    var_dump(isset($b)); // bool(true)
    var_dump(isset($c)); // bool(true)
    var_dump(isset($d)); // bool(false)

    var_dump(is_null($a)); // bool(true)
    var_dump(is_null($b)); // bool(false)
    var_dump(is_null($c)); // bool(false)
    var_dump(is_null($d)); // bool(true)

    var_dump(empty($a)); // bool(true)
    var_dump(empty($b)); // bool(true)
    var_dump(empty($c)); // bool(true)
    var_dump(empty($d)); // bool(true)
  • 对比

isset()函数为false的情况

  • 变量的值为null
  • 未定义的变量
  • unset()变量之后

is_null函数为true的情况(和isset相反)

  • 变量的值为null
  • 未定义的变量
  • unset()变量后

empty()函数为true的情况

  • 空字符串
  • false
  • 空数组array()
  • NULL
  • 0
  • 浮点数0.0
    • 字符串0.0为false
  • unset之后的变量
  • 字符串0
  • 未定义的变量$var
  • 没有任何属性的对象

unset()函数,变量的值变为NULL

1
2
3
4
5
6
$a = '123';
var_dump($a);// string(3) "123"
unset($a);
var_dump($a);// NULL
var_dump($a === NULL);// bool(true)
var_dump(empty($a)); //bool(true)
  • 表格
对比项 isset()方法 empty()方法 is_null方法
空字符串”” true ture false
一个空格” “ true false false
FALSE true true false
TRUE true false false
空数组array() true true false
NULL false true true
字符串”0” true true false
整型0 true true false
浮点型0.0 true true false
未定义的变量$a false true true
  • 综合

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    $a = "";
    $b = " ";
    $c = false;
    $d = true;
    $e = array();
    $f = null;
    $g = 0;
    $h = 0.0;
    $i = "0";

    var_dump(isset($a)); // bool(true)
    var_dump(isset($b)); // bool(true)
    var_dump(isset($c)); // bool(true)
    var_dump(isset($d)); // bool(true)
    var_dump(isset($e)); // bool(true)
    var_dump(isset($f)); // bool(false)
    var_dump(isset($g)); // bool(true)
    var_dump(isset($h)); // bool(true)
    var_dump(isset($i)); // bool(true)
    var_dump(isset($j)); // bool(false)

    var_dump(is_null($a)); // bool(false)
    var_dump(is_null($b)); // bool(false)
    var_dump(is_null($c)); // bool(false)
    var_dump(is_null($d)); // bool(false)
    var_dump(is_null($e)); // bool(false)
    var_dump(is_null($f)); // bool(true)
    var_dump(is_null($g)); // bool(false)
    var_dump(is_null($h)); // bool(false)
    var_dump(is_null($i)); // bool(false)
    var_dump(is_null($j)); // bool(true)

    var_dump(empty($a)); // bool(true)
    var_dump(empty($b)); // bool(false)
    var_dump(empty($c)); // bool(true)
    var_dump(empty($d)); // bool(false)
    var_dump(empty($e)); // bool(true)
    var_dump(empty($f)); // bool(true)
    var_dump(empty($g)); // bool(true)
    var_dump(empty($h)); // bool(true)
    var_dump(empty($i)); // bool(true)
    var_dump(empty($j)); // bool(true)
  • 特例

    1
    2
    3
    4
    var_dump(empty(0));      // bool(true)
    var_dump(empty('0')); // bool(true)
    var_dump(empty(0.00)); // bool(true)
    var_dump(empty('0.00')); // bool(false) 特殊记忆字符串0.00
  1. func_num_args-func_get_arg-func_get_args

PHP默认支持按值传递参数,通过引用传递参数以及默认参数,也支持可变长度参数列表,其中可变长度参数列表就主要是通过以下几个函数实现的。

  • func_num_args

    • 语法 func_num_args(void):int

    • 说明:返回调用函数的传入参数个数

      • 参数:void,即不需要传参
      • 返回值:int型,为传入函数的参数数量
    • demo

      1
      2
      3
      4
      5
      6
      7
      8
      function test()
      {
      $count = func_num_args();
      echo $count;
      }

      test(1, 2); //2
      test(1, 2, 3); //3
  • func_get_arg

    • 语法 func_get_arg(int $arg_num):mixed

    • 说明:返回参数列表的某一项

      • 参数:arg_num,参数的偏移量,函数的参数从0开始计数
      • 返回值:mixed,返回指定的参数,错误则返回FALSE
    • demo

      1
      2
      3
      4
      5
      6
      7
      8
      9
      function test()
      {
      $one = func_get_arg(0);
      $two = func_get_arg(1);

      echo $one,PHP_EOL,$two,PHP_EOL;
      }

      test(1, 2);

当在自定义函数的外面调用的该函数的时候会发出一个警告,或者是当arg_num比实际传入的参数的数目大的时候也会发出一个警告。

  • func_get_args

    • 语法 func_get_args(void):array

    • 说明:返回一个包含函数参数列表的数组

      • 参数:void,即不需要传参
      • 返回值:array,一个数组,其中每个元素都是目前用户自定义函数的参数列表的相应元素的副本。
    • demo

      1
      2
      3
      4
      5
      6
      7
      function test()
      {
      $arg = func_get_args();
      print_r($arg);
      }

      test(1, 2);

在用户自定义函数外调用则会出现错误警告。

  1. get_object_vars和compact

    get_object_vars ———— 返回由对象属性组成的关联数组,compact ———— 建立一个数组,包括变量名和它们的值。

  2. array_map、array_filter、array_walk

    • 相同点:都是利用回调函数对数组中每个元素进行操作

    • 不同点

      • 返回值
        • array_map 返回数组,遍历数组元素调用函数
        • array_walk 返回true/false
        • array_filter 返回数组,作用是过滤数组中的元素,回调函数返回真才能保存到返回数组中
      • 回调函数的参数及顺序
      • 是否改变数组的值
    • demo

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    $num = array(0, 1, 2); 
    $map = array_map(function ($v) {
    return $v == 0 ? 0 : 10;
    }, $num);
    print_r($map);
    输出:
    Array
    (
    [0] => 0
    [1] => 10
    [2] => 10
    )

    A.不传回调函数
    $filter = array(
    'a' => null,
    'b' => false,
    'c' => 0,
    'e' => '',
    'd' => 1,
    );
    $new = array_filter($filter);
    print_r($new);
    输出:
    Array
    (
    [d] => 1
    )
    B.传回调函数
    $num = array(0,1,2);
    $filter = array_filter($num, function($v){
    return $v == 0 ? '' : $v;
    });
    print_r($filter);
    输出:
    Array
    (
    [1] => 1
    [2] => 2
    )

    A.传值
    $num = array(0, 1, 2);
    array_walk($num, function ($v, $k) {
    $v++;
    });
    print_r($num);
    输出:
    Array
    (
    [0] => 0
    [1] => 1
    [2] => 2
    )

    B.传引用
    array_walk($num, function (&$v, $k) {
    $v++;
    });
    print_r($num);
    输出:
    Array
    (
    [0] => 1
    [1] => 2
    [2] => 3
    )

    C.官网示例
    $fruits = array(
    'a' => 'apple',
    'b' => 'banana',
    );
    function changeValue(&$item, $key, $prefix) {
    $item = "$prefix: $item";
    }
    function printItem($item, $key) {
    echo "$key. $item<br />\n";
    }
    echo "改变值之前打印:\n";
    array_walk($fruits, 'printItem');
    array_walk($fruits, 'changeValue', 'fruit');
    echo "\n改变值之后打印:\n";
    array_walk($fruits, 'printItem');
  1. 魔术方法之call和callStatic

    • 定义

      • __call($method, $arg),调用不可访问或不存在的方法时被调用
      • __callStatic($method, $arg),调用不可访问或不存在的静态方法时被调用
    • demo

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    class Person {

    private function getPrivateFunc()
    {
    echo "Private function";
    }

    private static function getPrivateStaticFunc($arg)
    {
    echo "Private static function";
    }

    private static function getProtectedStaticFunc($arg)
    {
    echo "Private static function";
    }

    public function __call($method, $arg)
    {
    return call_user_func_array('print_r', $arg);
    }

    public static function __callStatic($method, $arg)
    {
    return call_user_func('print_r', $arg);
    }
    }
    $p = new Person();

    $p->getMyFunc([1,2,3]);

    $p->getPrivateFunc(1);

    Person::getStaticFunc('a');

    Person::getPrivateStaticFunc('b');

    Person::getProtectedStaticFunc('c');

    输出:
    Array
    (
    [0] => 1
    [1] => 2
    [2] => 3
    )

    1

    Array
    (
    [0] => a
    )

    Array
    (
    [0] => b
    )

    Array
    (
    [0] => c
    )
  2. pack和unpack

五、register_shutdown_function

  1. register_shutdown_function(callable $callback[, mixed $parameter[, mixed $... ]]):void,注册一个callback,它会在脚本执行完成或者exit()后被调用。可以多次调用register_shutdown_function(),这些被注册的回调会按照他们注册时的顺序被依次调用。如果你在注册的方法内部调用 exit(),那么所有处理会被中止,并且其他注册的中止回调也不会再被调用。

  2. Note

    • 在某些web server(如Apache)上,可以在中止函数内对脚本的工作目录进行修改。
    • 如果进程被信号SIGTERM或SIGKILL杀死,那么中止函数将不会被调用。尽管你无法中断SIGKILL,但你可以通过pcntl_signal()来捕获SIGTERM,通过在其中调用exit()来进行一个正常的中止。
  3. 基本用法,和别的注册回调没太大差别

1
2
3
4
5
6
function shutdown()
{
echo 'Script executed with success', PHP_EOL;
}
register_shutdown_function('shutdown');
//call_user_func('shutdown');
  1. 和魔术函数__destruct()对比,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
ini_set("max_execution_time", "10");

class TestOne
{
function __construct()
{
register_shutdown_function(array(&$this, 'shutdown_func'));
}

function shutdown_func() {
$fp = fopen("/Users/playcrab/Desktop/exec.txt", "w+");
fputs($fp, "执行超时,正常输出");
fclose($fp);
}
};

$obj = new TestOne();
while (true) {
echo 1;
}


class TestTwo
{
function __destruct()
{
$fp = fopen("/Users/playcrab/Desktop/destruct.txt", "w+");
fputs($fp, "执行超时,不能输出");
fclose($fp);
}
};

$obj = new TestTwo();
while (true) {
echo 2;
}

由对比可知,使用register_shutdown_function能保证即使脚本异常中止时,清理函数的代码仍然能够执行。

  1. 结合进程扩展控制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
declare(ticks = 1);

//信号处理函数
function sig_handler($signo)
{
switch ($signo) {
case SIGTERM:
exit;
break;
case SIGHUP:
break;
case SIGUSR1:
echo "Caught SIGUSR1...\n";
break;
default:
break;
}

}
echo "Installing signal handler...\n";

//安装信号处理器
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");

$obj = new T();

// pcntl_signal(SIGUSR1, array($obj, "test"));
pcntl_signal(SIGUSR1, array($obj, '__construct'));

echo "Generating signal SIGTERM to self...\n";

posix_kill(posix_getpid(), SIGUSR1);//向当前进程发送SIGUSR1信号

echo "Done\n";

class T
{
public function __construct()
{
register_shutdown_function(array(&$this, 'handle'));
}

public function test()
{
register_shutdown_function(array(&$this, 'handle'));
}

public function handle()
{
file_put_contents('/Users/playcrab/Desktop/111.txt', 2);
echo '进程挂了但是内容保存了';
}
}
  1. 官网手册

六、debug_backtrace

  1. 用法debug_backtrace([ int$options = DEBUG_BACKTRACE_PROVIDE_OBJECT[, int $limit = 0 ]]):array

    • 返回一个包含众多关联数组的array
  2. 返回值说明

名字 类型 说明
function string 当前的函数名。
line integer 当前的行号。
file string 当前的文件名。
class string 当前 class 的名称。
object object 当前的 object。
type string 当前调用的类型。如果是一个方法,会返回 “->”。如果是一个静态方法,会返回 “::”。 如果是一个函数调用,则返回空。
args array 如果在一个函数里,这会列出函数的参数。 如果是在一个被包含的文件里,会列出包含的文件名。
  1. 测试代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function func1() {
func2();
}

function func2() {
func3();
}

function func3() {
$debug = debug_backtrace();
print_r($debug);
}
func1();
exit;
  1. 运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Array
(
[0] => Array
(
[file] => your_path
[line] => 8
[function] => func3
[args] => Array
(
)
)
[1] => Array
(
[file] => your_path
[line] => 4
[function] => func2
[args] => Array
(
)
)
[2] => Array
(
[file] => your_path
[line] => 15
[function] => func1
[args] => Array
(
)
)
)
  1. 官网手册

七、str_replace

  1. 功能:子字符串替换

  2. 用法:str_replace(mixed $search, mixed $replace, mixed $subject[, int &$count ]): mixed

  3. 说明:该函数返回一个字符串或者数组。该字符串或数组是将subject中全部的search都被replace替换之后的结果。

    • 如果searchreplace为数组,那么str_replace()将对subject做二者的映射替换,它们的值将会被依次处理。
    • 如果replace的值的个数少于search的个数,多余的替换将使用空字符串来进行。
    • 如果search是一个数组而replace是一个字符串,那么search中每个元素的替换将始终使用这个字符串。
  4. 参数

    • search:查找的目标值,也就是 needle。一个数组可以指定多个目标。
    • replace:search 的替换值。一个数组可以被用来指定多重替换。
    • subject:执行替换的数组或者字符串。也就是 haystack。如果 subject 是一个数组,替换操作将遍历整个 subject,返回值也将是一个数组。
    • count:如果被指定,它的值将被设置为替换发生的次数。
  5. demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## 1.简单替换并计数
$str = 'AaaaaBbCc';
$search = 'a';
$replace = 'A';
$str = str_replace($search, $replace, $str, $count);
echo $str . '--' .$count; //AAAAABbCc--4

## 2.多个替换
$search = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");
$res = str_replace($search, "", "Hello World of PHP");
echo $res; //Hll Wrld f PHP

## 3.多个对应替换
$str = "You should eat aa, bb, and cc every day.";
$search = array("aa", "bb", "cc", "dd");
$replace = array("AA", "BB", "CC");
$str = str_replace($search, $replace, $str);
echo $str;// You should eat AA, BB, and CC every day.

八、函数的参数

  1. 通过参数列表可以传递信息到函数,即以逗号作为分隔符的表达式列表。参数是从左向右求值的。PHP支持按值传递参数(默认),通过引用传递参数以及默认参数,也支持可变长度参数列表。
  2. 不声明参数类型
  3. 强制声明参数类型
参数类型 说明 PHP最小版本支持
class/interface name The parameter must be an instanceof the given class or interface name. PHP 5.0.0
self The parameter must be an instanceof the same class as the one the method is defined on. This can only be used on class and instance methods. PHP 5.0.0
array The parameter must be an array. PHP 5.1.0
callable The parameter must be a valid callable. PHP 5.4.0
bool The parameter must be a boolean value. PHP 7.0.0
float The parameter must be a floating point number. PHP 7.0.0
int The parameter must be an integer. PHP 7.0.0
string The parameter must be a string. PHP 7.0.0
  1. 延伸
    • 可变参数...
1
2
3
4
5
6
7
8
9
10
11
12
13
function add(...$numbers) {  
$sum = 0;
foreach ($numbers as $n) {
$sum += $n;
}
return $sum;
}

echo add(1, 2, 3),PHP_EOL;
echo add(1, 2, 3, 4),PHP_EOL;
echo add(1, 2, 3, 4, 5),PHP_EOL;

exit;
  • func_num_args/func_get_arg/func_get_args
1
2
3
4
5
6
7
8
9
10
11
function test() {
$num = func_num_args();
echo "num of test args:" . $num,PHP_EOL;
$args = func_get_args();
for ($i = 0; $i < $num; $i++) {
echo "The $i arg of func_get_args is:" . $args[$i],PHP_EOL;
echo "The $i arg of func_get_arg is:" . func_get_arg($i), PHP_EOL;
}
}

test(1,2,3);
  1. 参考