Maison  >  Article  >  développement back-end  >  Une brève discussion du code source PHP vingt-deux : à propos de la fonction array_splice

Une brève discussion du code source PHP vingt-deux : à propos de la fonction array_splice

不言
不言original
2018-06-28 17:50:592196parcourir

Cet article présente principalement Une brève discussion sur le code source PHP 22 : Concernant la fonction array_splice, elle a une certaine valeur de référence. Maintenant, je la partage avec vous. Les amis dans le besoin peuvent s'y référer

A. brève discussion sur le code source PHP vingt-deux : à propos de la fonction array_splice
array_splice
(PHP 4, PHP 5)

array_splice — supprime une partie du tableau et remplace-la par d'autres valeurs
Explication
array array_splice (array &input, int offset [, int length [, array replace]] )

array_splice() supprime les cellules spécifiées par offset et length dans le tableau d'entrée Si le paramètre de remplacement est. à condition que les cellules du tableau de remplacement soient utilisées pour le remplacement. Renvoie un tableau contenant les cellules supprimées. Notez que les noms de touches numériques en entrée ne sont pas conservés.

Si le décalage est positif, la suppression commence au décalage spécifié par cette valeur dans le tableau d'entrée. Si le décalage est négatif, la suppression commence au décalage spécifié par cette valeur à partir de la fin de la saisie.

Si la longueur est omise, toutes les parties du tableau, du décalage à la fin, sont supprimées. Si la longueur est spécifiée et est positive, ce nombre de cellules est supprimé. Si la longueur est spécifiée et est négative, tous les éléments du décalage à la longueur en décompte à partir de la fin du tableau sont supprimés. Astuce : Pour supprimer tous les éléments du décalage jusqu'à la fin du tableau lorsque le remplacement est effectué, utilisez count($input) comme longueur.

Si un tableau de remplacement est donné, les cellules supprimées sont remplacées par les cellules de ce tableau. Si la combinaison de offset et de longueur n'entraîne la suppression d'aucune valeur, l'élément du tableau de remplacement sera inséré à la position spécifiée par offset. Notez que les noms de clés dans le tableau de remplacement ne sont pas conservés. Si la valeur utilisée pour remplacer n'est qu'une unité, alors il n'est pas nécessaire d'y ajouter array(), à moins que l'unité elle-même ne soit un tableau

La fonction array_splice appelle la fonction php_splice La description du code principal de. cette fonction est la suivante :

 /* 创建并初始化返回数组,此返回数组为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);

L'ensemble du processus :
1. Copiez les éléments du début vers offset vers le tableau de retour
2. Supprimez les éléments de offset vers offset+length.
3. S'il y a un élément de remplacement, insérez le nouvel élément dans la position après offset
4. Insérez la fonction après offset+length dans le tableau renvoyé
5. Réinitialisez le curseur du tableau

<.>Ce qui précède représente l'intégralité du contenu de cet article, j'espère qu'il sera utile à l'apprentissage de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Une brève discussion du code source PHP vingt et un : à propos de la fonction array_slice

Un bref discussion du code source PHP vingt et un : À propos de array_flip, fonction array_reverse

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn