Maison  >  Article  >  développement back-end  >  Principe de mise en œuvre du tableau PHP

Principe de mise en œuvre du tableau PHP

angryTom
angryTomoriginal
2019-08-22 15:36:544671parcourir

Principe de mise en œuvre du tableau PHP

Les tableaux sont le type de données le plus couramment utilisé en PHP. En même temps, PHP est facile à utiliser grâce à ses tableaux puissants, mais comment les tableaux sont-ils implémentés en PHP ?

Tutoriel recommandé : Tutoriel vidéo PHP

Tout d'abord, comprenons d'abord la structure de données pertinente, comme suit Établir une base solide pour le contenu

Table de hachage

La table de hachage, comme son nom l'indique, est une sorte de mappage de différents mots-clés à différents structure de données des unités. La méthode de mappage de différents mots-clés à différentes unités est appelée fonction de hachage

Idéalement, après le traitement de la fonction de hachage, les mots-clés et les unités correspondront un à un, mais si la valeur du mot-clé est suffisante, dans de nombreux cas, c'est le cas ; il est facile de mapper plusieurs mots-clés sur la même unité, c'est-à-dire des conflits de hachage

La solution aux conflits de hachage est d'utiliser soit la méthode de chaînage, soit la méthode d'adressage ouverte

Lien méthode
Autrement dit, lorsque différents mots-clés sont mappés à la même unité, une liste chaînée est utilisée pour enregistrer ces mots-clés dans la même unité

Méthode d'adressage ouverte
Autrement dit, lors de l'insertion de données, s'il s'avère qu'il y a des données dans l'unité à laquelle le mot-clé est mappé, cela signifie qu'un conflit s'est produit, puis continuez à rechercher l'unité suivante jusqu'à ce qu'une unité disponible soit trouvée

Et comme la méthode d'adressage ouverte occupe l'emplacement d'autres unités de mappage de mots-clés, les mots-clés suivants sont plus susceptibles d'avoir des conflits de hachage et sont donc sujets à une dégradation des performances

Lié list

Puisque nous avons mentionné les listes chaînées ci-dessus, nous parlons brièvement ici des bases des listes chaînées. Les listes chaînées sont divisées en plusieurs types. Les structures de données couramment utilisées incluent : la file d'attente, la pile, la liste chaînée bidirectionnelle, etc.

Une liste chaînée est une structure de données composée de différents nœuds de liste chaînée. Un nœud de liste chaînée se compose généralement d’un élément + un pointeur vers le nœud suivant. La liste doublement chaînée, comme son nom l'indique, est composée d'un pointeur vers le nœud précédent + un élément + un pointeur vers le nœud suivant

Quant au contenu de la structure de données, nous ne nous développerons pas trop .Nous aurons un contenu spécial plus tard. Introduction détaillée à la structure des données

tableau php

La façon dont PHP résout les conflits de hachage est d'utiliser le. méthode de chaînage, donc le tableau PHP est composé de table de hachage + implémentation de liste chaînée, pour être précis, est implémentée par table de hachage + liste doublement chaînée.

Structure interne - Table de hachage

La structure HashTable est principalement utilisée pour stocker les informations de base de la table de hachage

typedef struct _hashtable { 
    uint nTableSize;        // hash Bucket的大小,即哈希表的容量,最小为8,以2x增长。
    uint nTableMask;        // nTableSize-1 , 索引取值的优化
    uint nNumOfElements;    // hash Bucket中当前存在的元素个数,count()函数会直接返回此值 
    ulong nNextFreeElement; // 下一个可使用的数字键值
    Bucket *pInternalPointer;   // 当前遍历的指针(foreach比for快的原因之一)
    Bucket *pListHead;          // 存储整个哈希表的头元素指针
    Bucket *pListTail;          // 存储整个哈希表的尾元素指针
    Bucket **arBuckets;         // 存储hash数组
    dtor_func_t pDestructor;    // 在删除元素时执行的回调函数,用于资源的释放
    zend_bool persistent;       //指出了Bucket内存分配的方式。如果persisient为TRUE,则使用操作系统本身的内存分配函数为Bucket分配内存,否则使用PHP的内存分配函数。
    unsigned char nApplyCount; // 标记当前hash Bucket被递归访问的次数(防止多次递归)
    zend_bool bApplyProtection;// 标记当前hash桶允许不允许多次访问,不允许时,最多只能递归3次
#if ZEND_DEBUG
    int inconsistent;
#endif
} HashTable;

La structure Bucket est utilisée Le contenu spécifique des données enregistrées

typedef struct bucket {
    ulong h;            // 对char *key进行hash后的值,或者是用户指定的数字索引值
    uint nKeyLength;    // hash关键字的长度,如果数组索引为数字,此值为0
    void *pData;        // 指向value,一般是用户数据的副本,如果是指针数据,则指向pDataPtr
    void *pDataPtr;     // 如果是指针数据,此值会指向真正的value,同时上面pData会指向此值
    struct bucket *pListNext;   // 指向整个哈希表的该单元的下一个元素
    struct bucket *pListLast;   // 指向整个哈希表的该单元的上一个元素
    struct bucket *pNext;       // 指向由于哈希冲突导致存放在同一个单元的链表中的下一个元素
    struct bucket *pLast;       // 指向由于哈希冲突导致存放在同一个单元的链表中的上一个元素
    // 保存当前值所对于的key字符串,这个字段只能定义在最后,实现变长结构体
    char arKey[1];              
} Bucket;

Il y a un élément pData dans la structure Bucket qui pointe vers les données utilisateur, qui pointe en fait vers la structure variable zval que nous avons introduite précédemment. C'est pourquoi lors de la création d'un tableau, l'élément du tableau + apparaît 1 conteneur de variable.

Schéma de la structure interne de la table de hachage

Principe de mise en œuvre du tableau PHP

À partir de la figure ci-dessus, nous pouvons voir que lorsque Bucket stocke des données, s'il y a un conflit de hachage, plusieurs mots-clés seront mappés à la liste chaînée, formant ainsi une liste doublement chaînée

Résumé

Aujourd'hui, nous utilisons des tableaux comme le point de départ, nous avons brièvement compris les structures de données de base : tables de hachage et listes chaînées ; et avons également appris l'implémentation sous-jacente des tableaux, c'est-à-dire tables de hachage + listes doublement chaînées. En fait, la table de hachage est la structure de données la plus importante en PHP et a de nombreuses utilisations. Les tables de symboles variables, les listes de fonctions, etc. sont toutes stockées à l'aide de tables de hachage

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