您的位置:首页 > PHP > PHP源码阅读笔记二十二:array_splice函数

PHP源码阅读笔记二十二:array_splice函数

PHP源码阅读笔记二十二:array_splice函数
array_splice
(PHP 4, PHP 5)

array_splice — 把数组中的一部分去掉并用其它值取代
说明
array array_splice ( array &input, int offset [, int length [, array replacement]] )

array_splice() 把 input 数组中由 offset 和 length 指定的单元去掉,如果提供了 replacement 参数,则用 replacement 数组中的单元取代。返回一个包含有被移除单元的数组。注意 input 中的数字键名不被保留。

如果 offset 为正,则从 input 数组中该值指定的偏移量开始移除。如果 offset 为负,则从 input 末尾倒数该值指定的偏移量开始移除。

如果省略 length,则移除数组中从 offset 到结尾的所有部分。如果指定了 length 并且为正值,则移除这么多单元。如果指定了 length 并且为负值,则移除从 offset 到数组末尾倒数 length 为止中间所有的单元。小窍门:当给出了 replacement 时要移除从 offset 到数组末尾所有单元时,用 count($input) 作为 length。

如果给出了 replacement 数组,则被移除的单元被此数组中的单元替代。如果 offset 和 length 的组合结果是不会移除任何值,则 replacement 数组中的单元将被插入到 offset 指定的位置。注意替换数组中的键名不保留。如果用来替换的值只是一个单元,那么不需要给它加上 array(),除非该单元本身就是一个数组

array_splice函数调用的是php_splice函数,对于此函数的主要代码说明如下:

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
/* 创建并初始化返回数组,此返回数组为php_splice的返回数组,并非array_splice的返回数组(array_splice的返回数组为removed)*/
ALLOC_HASHTABLE(out_hash);    
zend_hash_init(out_hash, 0, NULL, ZVAL_PTR_DTOR, 0);
/*将数组中从开始到offset的元素拷贝到返回数组中 */
for (pos=0, p=in_hash->pListHead; pos<offset && p ; pos++, p=p->pListNext) {
 
    entry = *((zval **)p->pData);
    entry->refcount++;
/*更新返回数组 */
if (p->nKeyLength)
    zend_hash_quick_update(out_hash, p->arKey, p->nKeyLength, p->h, &entry, sizeof(zval *), NULL);
else
    zend_hash_next_index_insert(out_hash, &entry, sizeof(zval *), NULL);
}
/* 将需要移除的元素赋值给removed,即array_splice的返回数组 */
if (removed != NULL) {
    for ( ; pos<offset+length && p; pos++, p=p->pListNext) {
    entry = *((zval **)p->pData);
    entry->refcount++;
    if (p->nKeyLength)
        zend_hash_quick_update(*removed, p->arKey, p->nKeyLength, p->h, &entry, sizeof(zval *), NULL);
    else
        zend_hash_next_index_insert(*removed, &entry, sizeof(zval *), NULL);
    }
} else /* 其它情况,跳过这些元素 */
    for ( ; pos<offset+length && p; pos++, p=p->pListNext);
/* 如果有元素需要插入,即有replacement参数 */
if (list != NULL) {
/* 对于每个元素,创建新的zval,拷贝并将它写入到返回数组中*/
    for (i=0; i<list_count; i++) {
        entry = *list[i];
        entry->refcount++;
        zend_hash_next_index_insert(out_hash, &entry, sizeof(zval *), NULL);
    }
}
/* 拷贝剩下的元素 */
for ( ; p ; p=p->pListNext) {
    entry = *((zval **)p->pData);
    entry->refcount++;
    if (p->nKeyLength)
        zend_hash_quick_update(out_hash, p->arKey, p->nKeyLength, p->h, &entry, sizeof(zval *), NULL);
    else
        zend_hash_next_index_insert(out_hash, &entry, sizeof(zval *), NULL);
}
 
/* 重置数组的游标,相当于reset函数*/
zend_hash_internal_pointer_reset(out_hash);

整个过程:
1、拷贝从开始到offset的元素到返回数组
2、移除从offset开始到offset+length的元素
3、如果有替换的元素,将新元素插入到offset后面的位置
4、将offset+length后面的函数插入到返回数组后面
5、重置数组游标

EOF

本文地址:PHP源码阅读笔记二十二:array_splice函数    文章出处:PHP源码阅读,PHP设计模式,PHP学习笔记,项目管理-胖胖的空间

转载请以链接形式注明原始出处和作者,谢绝不尊重版权者抄袭!

暂无留言我要留言

必填

必填,绝不公开

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word