PHP 配列の実装原理

Aug 22, 2019 pm 03:36 PM
php 配列

PHP 配列の実装原理

配列は、PHP で最も一般的に使用されるデータ型です。同時に、PHP は強力な配列のおかげで使いやすくなっていますが、PHP では配列はどのように実装されるのでしょうか?

推奨チュートリアル: PHP ビデオ チュートリアル

まず、次のような関連するデータ構造を理解しましょう。コンテンツの適切な基盤を築く

ハッシュ テーブル

名前が示すように、ハッシュ テーブルは、さまざまなキーワードをさまざまなキーワードにマッピングするようなものです。単位のデータ構造。異なるキーワードを異なる単位にマッピングする方法をハッシュ関数と呼びます。

ハッシュ関数処理後のキーワードと単位は 1 対 1 に対応するのが理想的ですが、キーワードの値が十分であれば、多くの場合は 1 対 1 に対応します。複数のキーワードが同じユニットにマッピングされること、つまりハッシュの競合が発生しやすくなります。

ハッシュの競合の解決策は、チェーン方式またはオープン アドレッシング方式のいずれかを使用することです

リンク方法
つまり、異なるキーワードが同じユニットにマッピングされている場合、リンク リストを使用してこれらのキーワードを同じユニットに保存します。

#オープン アドレッシング方法 つまり、データを挿入するときに、キーワードがマッピングされているユニットにデータが存在することが判明した場合、競合が発生したことを意味し、使用可能なユニットが見つかるまで次のユニットの検索を続けます。

また、オープン アドレッシング方法は他のキーワード マッピング ユニットの場所を占有するため、後続のキーワードではハッシュの競合が発生する可能性が高く、したがってパフォーマンスが低下する傾向があります。

リンク リスト

リンク リストについては上で説明したので、ここではリンク リストの基本について簡単に説明します。リンク リストにはさまざまな種類があります。一般的に使用されるデータ構造には、キュー、スタック、双方向リンク リストなどが含まれます。

リンク リストは、さまざまなリンク リスト ノードで構成されるデータ構造です。リンク リスト ノードは通常、次のノードへのポインタを指す要素で構成されます。二重連結リストはその名の通り、前のノードを指すポインタ要素と次のノードを指すポインタ要素で構成されており、データ構造の内容についてはあまり拡張せず、特別な構造を持たせます。データ構造

php array

PHP がハッシュの競合を解決する方法は、リンク方式を使用することです。 PHP 配列はハッシュ テーブルのリンク リストです。実装は、正確には、ハッシュ テーブルの二重リンク リストによって実装されます。

内部構造 - ハッシュ テーブル

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;

Bucket 構造が使用されます保存されたデータの特定のコンテンツ

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;

Bucket 構造には、ユーザー データを指す pData 要素が含まれており、実際には、前に紹介した変数 zval 構造を指します。これが、配列を作成するときの理由です。要素 1 が表示されます。変数コンテナーです。

ハッシュ テーブルの内部構造図

上の図から、バケットがデータを保存するときに、ハッシュが競合すると、複数のキーワードがリンク リストにマッピングされ、二重リンク リストが形成されます。PHP 配列の実装原理

概要

今日は、配列を次のように使用します。エントリ ポイントでは、基本的なデータ構造であるハッシュ テーブルとリンク リストを簡単に理解し、配列の基礎となる実装、つまりハッシュ テーブルと二重リンク リストについても学びました。実際、ハッシュ テーブルは PHP で最も重要なデータ構造であり、多くの用途があります。変数シンボルテーブル、関数リストなどはすべてハッシュテーブルを使用して保存されます

以上がPHP 配列の実装原理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ホットトピック

PHPの配列の操作方法 PHPの配列の操作方法 Aug 20, 2025 pm 07:01 PM

phparrayshanddedatacollectionseffictifictlyusingindexorassociativeStructures; they recreated witharray()または[]、AccessedViakeys、ModifiedByAssignment、Iterated with foreach、およびmanipulatedUsingfunctionslikecount()、in_array()、Array_key_exists()、Array_exists()、Array_exists()、Array_key_exists()、Array_key_exists()、Array_key_exists()、

修正:イーサネット「未確認のネットワーク」 修正:イーサネット「未確認のネットワーク」 Aug 12, 2025 pm 01:53 PM

RestArtyourRouterandComputERTORESOLETORESOLVETEMPORARYGLITCHES.2.RUNTHENETWORKTROUBLESHOTERVIATHESTYSTEMESTOMESTOMONISTOMATICATELFIXCOMMONISSUES.3.RENEWTHEIPADDRESSUSINGINGINGINGINGINGINGINGINGCommandPromptasAdMinistratoratoratorByRunningIpConfig/リリース、IPConfig/reding、Netshwinsockreset

PHPでのオブザーバーのデザインパターンとその実装について説明してください。 PHPでのオブザーバーのデザインパターンとその実装について説明してください。 Aug 15, 2025 pm 01:54 PM

theobserverdesignpatternablesablesはautomatic of dependentobjectswhenasubject'sstatechanges.1)itdefinesaone-to-manydependencybetweenobjects;

PHPで$ _Cookie変数を使用する方法 PHPで$ _Cookie変数を使用する方法 Aug 20, 2025 pm 07:00 PM

$ _COOKIEISAPHUPSUBLOBLOACCESSINGCOOKIESSENTBYTHESTHEBROWSER; CookiESARESETUSSETCOOKIE()beforeTput、readvia $ _cookie ['name']、updated byReshingWithNewvalues、およびdeletedBysettingAnexprideStampridectiCectiCESTAMPRAGTPRAGTPRAGTPRINESTIMESTAMPRAGTPRUCTIMESTAMPRINESTIMESTAMPRINESTIMESTAMPRINETIMESTAMPRINESTIMESTAM

phpmyAdminセキュリティベストプラクティス phpmyAdminセキュリティベストプラクティス Aug 17, 2025 am 01:56 AM

phpMyAdminを効果的に保護するには、複数のセキュリティ対策を採用する必要があります。 1. IPを介してアクセスを制限すると、信頼できるIP接続のみが許可されます。 2.デフォルトのURLパスを推測が容易ではない名前に変更します。 3.強力なパスワードを使用して、最小限の権限を備えた専用のMySQLユーザーを作成すると、2要素認証を有効にすることをお勧めします。 4.既知の脆弱性を修正するには、phpmyAdminバージョンを維持します。 5. WebサーバーとPHP構成を強化し、危険な機能を無効にし、ファイルの実行を制限します。 6。信任状の漏れを防ぐために、HTTPSに通信を暗号化するように強制します。 7. HTTP基本認証を使用していない場合、または使用していない場合はPHPMyAdminを無効にします。 8.ログを定期的に監視し、fail2banを構成して、ブルートフォースの亀裂から防御します。 9。セットアップを削除します

XSLTパラメーターを使用して、動的変換を作成します XSLTパラメーターを使用して、動的変換を作成します Aug 17, 2025 am 09:16 AM

XSLTパラメーターは、外部の通過値を介した動的変換の重要なメカニズムです。 1.宣言されたパラメーターを使用し、デフォルト値を設定します。 2。XSLTarGumentListなどのインターフェイスにアプリケーションコード(C#など)から実際の値を渡します。 3.テンプレート内の$ paramName参照パラメーターを介して、条件付き処理、ローカリゼーション、データフィルタリング、または出力形式を制御します。 4.ベストプラクティスには、意味のある名前の使用、デフォルト値の提供、関連するパラメーターのグループ化、および値の検証が含まれます。パラメーターを合理的に使用すると、XSLTスタイルのシートが非常に再利用可能で保守可能になり、同じスタイルシートが異なる入力に基づいて多様な出力結果を生成できます。

PHPアプリケーションにAPIバージョン化をどのように実装しますか? PHPアプリケーションにAPIバージョン化をどのように実装しますか? Aug 14, 2025 pm 11:14 PM

Apiversioninginphpcanbeectiveiveivementedusingurl、ヘッダー、orqueryparameterapproaches、withurlanderversioningbeingmostrecommended.1

現在、NVIDIA GPUに接続されたディスプレイを使用していません[修正] 現在、NVIDIA GPUに接続されたディスプレイを使用していません[修正] Aug 19, 2025 am 12:12 AM

ifyousee "youarenotusing adisplayatchedtoannvidiagpu、" surseyourmonitoristuntedtothenvidiagpuport、configuredisissettingsintingsintingsintinginstingsintingduandcleaninstall、およびsettheprimarysodiscutodiscreteinbios/ueftereed

See all articles