ホームページ  >  記事  >  バックエンド開発  >  PHP の array_keys および array_unique 関数のソース コードの分析、arraykeys_PHP チュートリアル

PHP の array_keys および array_unique 関数のソース コードの分析、arraykeys_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-12 08:58:151149ブラウズ

PHP、arraykeys の array_keys および array_unique 関数のソース コードの分析

パフォーマンス分析

実行パフォーマンスの観点から、次のテストコードを見てください:

リーリー

実行結果は以下の通りです:

上の図からわかるように、array_unique 関数を使用すると 0.069 秒かかり、array_flip 関数を使用してから array_keys 関数を使用すると 0.00152 秒かかり、array_flip 関数を 2 回使用すると 0.00146 秒かかります。

テスト結果は、array_flip を使用してから array_keys 関数を呼び出す方が、array_unique 関数よりも高速であることを示しています。では、具体的な理由は何でしょうか?これら 2 つの関数が PHP の下部でどのように実装されているかを見てみましょう。

ソースコード解析

リーリー

上記は、array_keys 関数の基礎となるソース コードです。理解を容易にするために、著者はいくつかの中国語のコメントを追加しました。元のコードを表示する必要がある場合は、クリックして表示できます。この関数の機能は、一時的な配列を作成し、キーと値のペアを新しい配列にコピーすることです。コピー処理中に重複したキー値が発生した場合は、それらを新しい値に置き換えます。この関数の主なステップは、57 行目と 63 行目で呼び出される zend_hash_next_index_insert 関数です。この関数は要素を配列に挿入します。重複した値が出現した場合は、新しい値を使用して元のキー値が指す値を更新します。それ以外の場合、時間計算量は O(n) です。

リーリー

上記はarray_flip関数のソースコードです。リンクをクリックして元のコードを表示します。この関数の主な動作は、新しい配列を作成し、元の配列を走査することです。 26 行目で、元の配列の値が新しい配列のキーに割り当てられ、次に 37 行目で、重複がある場合は元の配列のキーが新しい配列の値に割り当てられます。 、古い値は新しい値で上書きされます。関数全体の時間計算量も O(n) です。したがって、array_flip を使用した後に array_keys を使用する場合の時間計算量は O(n) です。

次に、array_unique 関数のソースコードを見てみましょう。リンクをクリックして元のコードを表示します。

リーリー

ご覧のとおり、この関数は新しい配列を初期化し、値を新しい配列にコピーし、45 行目でソート関数を呼び出して配列をソートします。ソート アルゴリズムは、zend のブロック ツリー ソート アルゴリズムです。エンジン。次に、ソートされた配列を反復処理し、重複する要素を削除します。関数全体の中で最もコストがかかる部分はソート関数の呼び出しであり、クイック ソートの時間計算量は O(nlogn) です。したがって、この関数の時間計算量は O(nlogn) です。

結論

array_unique の最下層がクイック ソート アルゴリズムを呼び出すため、関数の実行にかかる時間コストが増加し、関数全体の実行が遅くなります。これが、array_keys が array_unique 関数よりも高速である理由です。

興味があるかもしれない記事:

    php array_unique 配下の配列に同じ値が存在するかどうかを判断する
  • php array_unique 後の json_encode は注意が必要
  • php 配列関数 sequence array_unique() - 重複する要素値を削除する配列内
  • PHP 配列関数 sequence array_keys() - 配列キー名を取得します
  • PHP は配列内の要素の位置を取得し、array_keys 関数アプリケーションを取得します

http://www.bkjia.com/PHPjc/1104337.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/1104337.html技術記事 PHP の array_keys 関数と array_unique 関数のソース コードの分析 Arraykeys のパフォーマンス分析は、次のテスト コードを見てください: $test=array();for($run=0; $run10000)。 ; $run++)...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。