ホームページ > バックエンド開発 > PHPチュートリアル > PHP による配列拡張の直感的な観察

PHP による配列拡張の直感的な観察

WBOY
リリース: 2016-06-13 12:17:19
オリジナル
1040 人が閲覧しました

PHP の詳細 - 配列
の拡張を直感的に観察する PHP 配列は、配列のデータ構造を誰でも簡単に表示できるようにするために、HashTable と二重リンク リストによって実装されることが知られています。 PHP 配列を走査してドット記述を生成する in が開発されており、ドット記述を生成した後、いくつかのレンダリング ツールを使用して画像を生成できます。
拡張機能の実装は非常に簡単で、PHP 配列のソース コードは次の 2 つの構造体によって実装されます。拡張機能は、これら 2 つの構造体と各構造体の関係をたどって、対応する Dot を生成します。説明するだけです。

Java コード PHP による配列拡張の直感的な観察
  1. typedef struct bucket {
  2. ulong h;                           
  3. uint nKeyLength;  
  4. void * pData;  
  5. void * pDataPtr;  
  6. struct bucket * pListNext;  
  7. struct bucket * pListLast;  
  8. struct bucket *pNext ;  
  9. struct bucket * pLast;  
  10. const char *arKey ;  
  11. } バケツ;  
  12. typedef struct _hashtable {
  13. uint nTableSize;  
  14. uint nTableMask;  
  15. uint nNumOfElements;  
  16. ulong nNextFreeElement;  
  17. バケット *pInternalPointer;      
  18. バケット *pListHead;  
  19. バケット *pListTail;  
  20. バケット **arBuckets;  
  21. dtor_func_t pDestructor;  
  22. zend_bool 永続的。  
  23. unsigned char nApplyCount ;  
  24. zend_bool bApplyProtection;  
  25. } ハッシュテーブル;  



扩展里边函数说明
---------------------------------- - ------------------------------------------------- - -------
string dotarray( array $input [, int $flag] )
配列データ構造のドット記述を生成します
パラメータ
input 操作が必要な配列
flag 3 つの定数または演算であるデータ構造を表示します。拡張機能によって提供され、それぞれ
DOTARAAY_HASH_TABLE は表示 HashTable 構造を表します
DOTARRAY_DOUBLE_LIST は配列の二重リンク リスト構造を表示します
DOTARRAY_CURRENT_POSITION配列を表示します 現在の内部ポインタ 位置
戻り値
正常にドット記述文字列、エラー (配列ではないなど) を返します。 false を返します
-------------------------------------- ---------------------------------------------------- ----
二重リンクリスト構造の例を表示

JavaコードPHP による配列拡張の直感的な観察
  1. $items = array(1, 28=>'ラララ'16=>'ハハハ''名前'=>'式',30=>'うおおお...');
  2. next($items);
  3. /*内部ポインタを次のビットに移動*/
  4. $result = dotarray($items, DOTARRAY_DOUBLE_LIST|DOTARRAY_CURRENT_POSITION);
  5. echo $result;
取得されたドットの説明:


Java コード
PHP による配列拡張の直感的な観察
  1. digraph html {label = "Structure of array";  
  2. node[shape = record];  
  3. ===========部分内容省略============  
  4. edge [color=black];  
  5. edge [color=green];  
  6. sk_array:f5:s -> sk_item_1:f0;  
  7. edge [color=black];  
  8. }  

次の画像は、graphviz レンダリングによって取得されたものです




説明が必要ですが、赤色実線は構造体の二重リンクリストの次のポインタ、赤い点線は前の要素のポインタです。同時に、DOTARRAY_CURRENT_POSITION フラグが提供され、キー 1 (最初の要素キーは 0) を持つ要素を指す配列の内部ポインターを指す緑色の線が表示されます。

HashTable 構造の例を表示

Java コード PHP による配列拡張の直感的な観察
  1. $items = array(1, 28=>'ラララ'16=>'ハハハ''名前'=>'式',30=>'うおおお...');  
  2. 次($items);  
  3. 次($items);  
  4. $result = dotarray($items,DOTARAAY_HASH_TABLE|DOTARRAY_CURRENT_POSITION);  
  5. echo $result;  

生成された構造図は次のとおりです:



ハッシュ競合の例
詳細については、PHP ハッシュ衝突のサービス拒否脆弱性原則を参照してください http://www.laruence.com/2011/12/29/2412 .html、簡単に説明すると、ハッシュ テーブルは「競合」(衝突) によりリンク リストに縮退します。データ量が十分に大きい場合、PHP は計算や検索時に大量の CPU 使用率を引き起こします。 、挿入することにより、サービス妨害攻撃が達成されます。以下は単純な衝突生成コードです:

Java コード PHP による配列拡張の直感的な観察
  1. ?php
  2. /*会生出pow(2,$n)个数字*/
  3. $n= 3;  
  4. $capacity = pow(2,$n);  
  5. $array =array();  
  6. for($i=0;$i
  7. $key = $i
  8. $array[$key] =1;  
  9. }
  10. $ str = dotarray($array,DOTARRAY_DOUBLE_LIST|DOTARAAY_HASH_TABLE);  
  11. echo $str,PHP_EOL;  

今回はハッシュテーブルと二重リンクテーブルを同時に表示します。渡されたフラグはDOTARRAY_DOUBLE_LIST|DOTARAAY_HASH_TABLEで、二重リンクリストとHashTableが同時に表示されます。 🎜>


ドット言語ポータルについて: http://zh.wikipedia.org/wiki/DOT 言語

ドット レンダリング ツール Graphviz ポータルについて: http://www.graphviz.org/


拡張ソースコード: https://github.com/Himer/dotarray

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート