PHP 配列の基本的な実装原理は次のとおりです: 1. ハッシュ テーブル、さまざまなキーワードをさまざまなユニットにマップするデータ構造; 2. リンク リスト、さまざまなリンク リスト ノード構造で構成されるデータのタイプ。 3. PHP 配列。リンク方式を使用してハッシュの競合を解決します。
1. ハッシュ テーブル
ハッシュ テーブルは、名前が示すように、さまざまなキーワードとデータをマッピングします。構造をさまざまなユニットに分割します。異なるキーワードを異なる単位にマッピングする方法をハッシュ関数と呼びます。
ハッシュ関数による処理後、キーワードと単位は 1 対 1 に対応するのが理想的ですが、キーワードの値が十分であれば多くの場合、場合によっては、複数のキーワードが同じユニットにマッピングされる、つまりハッシュの競合が発生しやすくなります。
ハッシュの競合の解決策は、リンク方式またはオープン アドレッシング方式のいずれかを使用することです
#リンク方法
つまり、データを挿入するときに、キーワードがマッピングされているユニットにデータが存在することが判明した場合、競合が発生したことを意味し、その後続行します。使用可能なユニットが見つかるまで次のユニットを検索します
オープン アドレッシング方式は他のキーワード マッピング ユニットの場所を占有するため、後続のキーワードではハッシュ競合が発生する可能性が高く、パフォーマンスの低下が発生しやすくなります
2. リンク リストリンク リストについては上で説明したので、ここではリンク リストの基本について簡単に説明します。リンク リストはさまざまなタイプに分類されます。一般的に使用されるデータ構造には、キュー、スタック、双方向リンク リストなどが含まれます。
リンク リストは、さまざまなリンク リスト ノードで構成されるデータ構造です。リンク リスト ノードは通常、次のノードへのポインタを指す要素で構成されます。二重リンク リストは、名前が示すように、前のノードを指すポインタ要素と次のノードを指すポインタで構成されます。
データ構造の内容については詳しく説明しません。データ構造
3. PHP 配列PHP がハッシュの競合を解決する方法は、リンク方式を使用することです。ハッシュテーブルリンクリストで実装されていますが、正確にはハッシュテーブル二重リンクリストで実装されています
4. 内部構造-ハッシュテーブルHashTable结构体主要用来存放哈希表的基本信息
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;
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;
#関連学習の推奨事項:
PHP プログラミングの入門から熟練度まで以上がPHP 配列の基本的な実装原理は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。