• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

浅谈PHP源码二十二:关于array_splice函数

php 搞代码 4年前 (2022-01-22) 31次浏览 已收录 0个评论

这篇文章主要介绍了关于 浅谈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函数,对于此函数的主要代码说明如下:

 /* 创建并初始化返回数组,此返回数组为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_inde<a style="color:transparent">、本文来源gao($daima.com搞@代@#码$网</a><big>搞gaodaima代码</big>x_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、重置数组游标

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请随时关注我们网站!

相关推荐:

浅谈PHP源码二十一:关于array_slice函数

浅谈PHP源码二十:关于array_flip,array_reverse函数

以上就是浅谈PHP源码二十二:关于array_splice函数的详细内容,更多请关注搞代码gaodaima其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:浅谈PHP源码二十二:关于array_splice函数

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址