ホームページ  >  記事  >  バックエンド開発  >  PHP 配列が複数のデータ型をどのように柔軟にサポートするかについての詳細な分析

PHP 配列が複数のデータ型をどのように柔軟にサポートするかについての詳細な分析

藏色散人
藏色散人転載
2023-03-25 15:31:441552ブラウズ

この記事では、PHP に関する関連知識をお届けします。主に、配列が複数のデータ型を柔軟にサポートする方法を紹介します。興味のある方は、以下を参照してください。お役に立てば幸いです。ヘルプ。

PHP 配列が複数のデータ型をどのように柔軟にサポートするかについての詳細な分析

PHP では、配列データ構造のアプリケーション処理が非常に頻繁に使用されますが、Java や C などの強く型付けされた言語と比較して、PHP の配列は単純に処理できると言われています。非常に使いやすく、さまざまなタイプのデータ (数値、文字列、オブジェクトなど) を保存できるため、開発に非常に便利です。

PHP 配列の強力な機能に基づいて、スタック、キュー、リスト、セット、ディクショナリなど、より複雑なデータ構造を簡単に実装できます。

PHP 配列が複数のデータ型をどのように柔軟にサポートするかについての詳細な分析

PHP はどのように配列を実装するのか、知りたいですか?

1. PHP 配列の基礎となるデータ構造

PHP 配列は HashTable 構造を使用して内部実装されているため、最初に HashTable について簡単に説明しましょう。

ハッシュ テーブルとも呼ばれる HashTable は、キーと値を介してデータに効率的にアクセスする構造です。ハッシュ テーブルは配列とリンク リストを組み合わせたもので、配列の高速アドレス指定とリンク リストの高速挿入を統合します。

PHP 配列が複数のデータ型をどのように柔軟にサポートするかについての詳細な分析

HashTable は主に 2 つのリンクに分かれています:

1. ハッシュ関数: ハッシュ関数は、検索する値を数値インデックスに変換し、数値インデックス。値が存在する場所をすぐに見つけることができます。

2. ハッシュ衝突: 理想的には、異なる値がハッシュ関数を通過した後の結果は異なります; 値が異なる場合、ハッシュ後に同じ数値が出力されます。ハッシュ衝突の場合。

したがって、HashTable を適用する場合、ハッシュ衝突の問題に直面する必要があり、その解決策には主にリンク リスト方式とオープン アドレッシング方式の 2 つがあります。

zend_type.h ファイルでは、次のように HashTable の主な構造定義を見つけることができます。

zend_array type

Pick a主要なメンバーを紹介しましょう:

  • #gc: 参照カウントとガベージ コレクション。

  • arData: ハッシュ テーブルに要素を格納する配列。そのメモリは連続的です。arData は配列の開始位置を指します。

  • ## nTableSize : 配列の総容量、つまり収容できる要素の数。arData のメモリ サイズはこの値に基づいて決定されます。そのサイズは 2 の累乗で、最小値は 8 です。順序: 8、16、32... 増加;

PHP 配列が複数のデータ型をどのように柔軟にサポートするかについての詳細な分析

バケット タイプ

バケットには比較的単純な構造で、主に要素のキーと値、および整数 h (ハッシュ値、またはハッシュ値) を保存するために使用されます。

  • 要素が数値インデックスの場合、その値は数値インデックスの値になります。

  • 要素が文字列インデックスの場合、その値は数値インデックスの値になります。 value は、Time33 アルゴリズムを使用して計算されたキー A のハッシュ値です。

h の値は、要素の保存場所を最終的にマップするために使用されます。

2. PHP 配列の基本的な実装

上の部分で zend_array のデータ構造について学習しましたので、初期化を見てみましょう。配列の:

配列の初期化は、主に HashTable メンバーの設定のために行われます。arData のメモリは、初期化中にすぐには割り当てられません。arData のメモリは、最初の要素が挿入された後に割り当てられます。

全体のハッシュ構造をよりよく理解するために、この構造を説明する例を挙げてみましょう:

$data = array(
    'hello' => 'haha',
    1       => 'me to'
    'world' => 'world', 
    2       => 2
);
unset($data[1]);
上記のハッシュ構造はどのように見えるべきでしょうか? arData によって保存された結果はどのようになるべきでしょうか?

わかりやすいように図を描いてみましょう:

arData はバケット タイプのポインタであり、各要素のキーを特に格納するために使用されます。 . value は要素が挿入された順序でデータを格納するため、配列の順序もこれによって保証されます。

arData 配列の各要素は、図からわかるように、左側の負の数値はハッシュ値を法した後の値で、右側には arData のインデックスが格納されます。 8 つの競合がある場合、リンクされたリストが保存されるヘッダー要素。

arData[0]: key='hello'、h=xx (特定の値)、val = 'haha'

arData[1]: val は type= zval IS_UNDEF の (設定解除後、すぐに削除されず、IS_UNDEF に設定されます)

arData[2]: key='world', h=xx (特定の値), val = 'world '

arData[3]: key=NULL、h=2 (ハッシュ値の競合が発生する可能性があります)、val = 2

.....

上記の例は非常に具体的です。 nNum Used、nNumOfElements、arData の意味。

3. PHP 配列の順序性

配列内の各要素の順序は、挿入順序と一致しています。これはどのようにして実現されるのでしょうか?

PHP 配列の順序性を実現するために、PHP の基礎となるハッシュ テーブルは、ハッシュ関数と要素配列の間にマッピング テーブルを追加します。このマッピング テーブルも配列であり、配列と同じサイズです。要素を格納します。格納要素のタイプは整数で、要素の添字を実際に格納された順序配列に保存するために使用されます。要素は実際の格納配列に順番に挿入され、配列の添字は次に従ってハッシュされます。ハッシュ関数 位置は、新しく追加されたマッピング テーブルに保存されます。

#このようにして、最終的に保存されるデータの順序が完成します。

この中間マッピング テーブルは、PHP 配列の基礎となる構造では明示的に識別されませんが、arData と一緒に配置されます。配列が初期化されると、バケットの保存に使用されるメモリが割り当てられるだけでなく、 uint32_t サイズのスペース、これら 2 つのスペースが一緒に割り当てられ、要素配列が格納されている場所に arData がオフセットされ、この中間マッピング テーブルは arData を介して前方にアクセスできます。

概要

PHP の配列の特徴は、値をキーの型にマッピングすることです。他の言語とは異なり、PHP の配列のキーは文字列にすることができ、値は任意の型にすることができます。

通常の追加、削除、変更、検索に加えて、配列にはコピー、マージ、破棄、リセットなどの他の多くの操作もあります。これらの操作に対応するコードは zend_hash.c にあります。 . 興味のある学生は、 について学ぶことができます。

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

以上がPHP 配列が複数のデータ型をどのように柔軟にサポートするかについての詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.imで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。