Maison  >  Article  >  développement back-end  >  Une brève discussion sur le code source PHP 19 : à propos des fonctions array_file et range

Une brève discussion sur le code source PHP 19 : à propos des fonctions array_file et range

不言
不言original
2018-06-28 17:41:161956parcourir

Cet article présente principalement une brève présentation du code source PHP 19 : concernant les fonctions array_file et range, il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

A. brève présentation du code source PHP 19 : Concernant array_file, fonction range

array_fill
(PHP 4 >= 4.2.0, PHP 5)

array_fill — remplit le tableau
avec la valeur donnée Description
array array_fill (int start_index, int num, Mixed value)

array_fill() remplit un tableau avec des entrées num en utilisant la valeur du paramètre value, en commençant par le nom de clé spécifié par le paramètre start_index. Notez que num doit être un nombre supérieur à zéro, sinon PHP émettra un avertissement.

Pour le paramètre start_index, il ne peut être que de type chaîne, entier et virgule flottante
Le code source est le suivant :

switch (Z_TYPE_PP(start_key)) {case IS_STRING:case IS_LONG:case IS_DOUBLE:
    .......    convert_to_long_ex(start_key);
    ......}

Le programme attribue d'abord la première valeur à return_value, puis boucle num – 1 fois : ajoutez refcount à cette valeur et ajoutez-la à la table de hachage de return_value

range
(PHP 3 >= 3.0.8, PHP 4, PHP 5)

plage — Crée un tableau contenant des cellules dans la plage spécifiée
Description
plage du tableau (mixte bas, mixte haut [, nombre pas] )

range() renvoie la plage de bas en haut dans les unités du réseau, y compris elles-mêmes. Si faible > élevé, la séquence passera de haut en bas.

Nouveaux paramètres : Le paramètre facultatif step est nouvellement ajouté dans PHP 5.0.0.

Si une valeur de pas est donnée, elle sera utilisée comme valeur de pas entre les unités. step doit être une valeur positive. Si elle n’est pas spécifiée, l’étape est par défaut 1.

Comme le montre le code, cette fonction ne prend en charge que les tableaux de caractères, les tableaux à virgule flottante et les tableaux d'entiers, et prend en charge les formes croissantes et décroissantes (disponible uniquement après la version 4.0.1)
Utilisation de tableaux de caractères Par exemple :

 if (Z_TYPE_P(zlow) == IS_STRING && Z_TYPE_P(zhigh) == IS_STRING && Z_STRLEN_P(zlow) >= 1 && Z_STRLEN_P(zhigh) >= 1) {
    int type1, type2;
    unsigned char *low, *high;
    long lstep = (long) step; 
    type1 = is_numeric_string(Z_STRVAL_P(zlow), Z_STRLEN_P(zlow), NULL, NULL, 0);
    type2 = is_numeric_string(Z_STRVAL_P(zhigh), Z_STRLEN_P(zhigh), NULL, NULL, 0);
    if (type1 == IS_DOUBLE || type2 == IS_DOUBLE || is_step_double) {
        goto double_str;
    } else if (type1 == IS_LONG || type2 == IS_LONG) {
        goto long_str;
    }
    convert_to_string(zlow);    //    转化为字符串,此函数的实现在zend_operators.c的536行:ZEND_API void _convert_to_string(zval *op ZEND_FILE_LINE_DC)
    convert_to_string(zhigh);
    low = (unsigned char *)Z_STRVAL_P(zlow);    //    当所给字符串长度大于1时,取第一个字符
    high = (unsigned char *)Z_STRVAL_P(zhigh);     if (*low > *high) { //    递减数组
    if (lstep <= 0) {
        err = 1;
        goto err;
    }
    for (; *low >= *high; (*low) -= (unsigned int)lstep) {
        add_next_index_stringl(return_value, low, 1, 1);
        if (((signed int)*low - lstep) < 0) {
            break;
        }
    }
    } else if (*high > *low) { //    递增数组
    if (lstep <= 0) {
        err = 1;
        goto err;
    }
    for (; *low <= *high; (*low) += (unsigned int)lstep) {
        add_next_index_stringl(return_value, low, 1, 1);
        if (((signed int)*low + lstep) > 255) {    //    只支持ASCII的255个字符
            break;
        }
    }
    } else {    //    开始和结束相等,则只返回包含一个元素的数组
        add_next_index_stringl(return_value, low, 1, 1);}

Le traitement de la virgule flottante et de l'entier est fondamentalement similaire, seule la méthode d'écriture dans la table de hachage est différente

Add_next_index_double est utilisé pour le type à virgule flottante
Add_next_index_double est utilisé pour un entier C'est add_next_index_long

Ce qui précède est l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de tout le monde. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Une brève discussion du code source PHP 18 : à propos de array_diff_key, array_diff_assoc, array_udiff_assoc Fonction

Brève discussion sur le code source PHP 16 : À propos de la fonction array_count_values ​​​​

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