PHPの配列トラバーサルに関する相違点(array_diffの応用例)

WBOY
リリース: 2016-07-25 08:58:38
オリジナル
853 人が閲覧しました
  1. function array_diff($array_1, $array_2) {

  2. $diff = array();

  3. foreach ($array_1 as $k => $v1) {

  4. $flag = false;
  5. foreach ($array_2 as $v2) {
  6. if ($flag = ($v1 == $v2)) {
  7. break;
  8. }
  9. }
  10. if (!$flag) {

  11. $diff[$k] = $v1;
  12. }
  13. }

  14. return $diff;

  15. }
  16. ?>
  17. < ;/p>
コードをコピー

上記のコードの実装は少し現実離れしています。 そこで再検討して、2 番目の関数を次のように最適化しました。

  1. function array_diff($array_1, $array_2) {

  2. foreach ($array_1 as $key => $item) {
  3. if (in_array($item, $ array_2, true)) {
  4. unset($array_1[$key]);
  5. }
  6. }

  7. return $array_1;

  8. }
  9. ?>
コードをコピー

今回は元のarray_diff関数とほぼ同じくらい高速です。 しかし、より最適化された方法はあるのでしょうか? PHP は次のように記述できることがわかりました。

  1. function array_diff($array_1, $array_2) {

  2. $array_2 = array_flip($array_2);
  3. foreach ($array_1 as $key => $item) {
  4. if (isset($array_2[$item])) {
  5. unset($array_1[$key]);
  6. }
  7. }

  8. return $array_1;

  9. }
  10. ?>
コードをコピー

この関数の効率は驚くべきもので、元の array_diff 関数よりもさらに高速です。理由を調べてみると、次のような説明が見つかりました:

キーは HASH で構成されているため、検索は高速です。 値はキーによってのみ編成および保存され、インデックス自体はなく、各検索が横断されます。要約する これは PHP 言語のちょっとしたトリックですが、配列の値を走査して比較する場合、値を比較する必要がある場合は、キーを使用して値を反転する方が、通常の値間の比較よりもはるかに効率的です。

たとえば、上記の関数 2 は in_array 関数を呼び出し、それが関数内にあるかどうかを判断するためにループする必要がありますが、関数 3 はキーが配列内に存在するかどうかを判断するだけです。配列のキーと値のさまざまな組織的なインデックス付け方法と組み合わせると、効率が想像よりも高いことがよくわかります。

完全なコードは次のとおりです。

  1. function microtime_float() {
  2. list($usec, $sec) =explode(" ", microtime());
  3. return ((float)$usec + (float)$sec);
  4. }

  5. function array_diff2($array_1, $array_2) {

  6. $diff = array();

  7. foreach ($ array_1 as $k =>v1) {

  8. $flag = false;
  9. foreach ($array_2 as $v2) {
  10. if ($flag = ($v1 == $v2)) {
  11. break;
  12. }
  13. }

  14. if (!$flag) {

  15. $diff[$k] = $v1;
  16. }
  17. }

  18. return $diff;

  19. }< /p>
  20. function array_diff3($array_1, $array_2) {
  21. foreach ($array_1 as $key => $item) {
  22. if (in_array($item, $array_2, true)) {
  23. unset($array_1[$key]);
  24. }
  25. }

  26. return $array_1;

  27. }

  28. function array_diff4($array_1, $array_2) {
  29. $array_2 = array_flip($array_2);
  30. foreach ($array_1 as $key => $item) {
  31. if (isset($array_2[$item])) {
  32. unset($array_1[$key]) ;
  33. }
  34. }

  35. return $array_1;

  36. }

  37. /////////////////// / ///////////

  38. for($i = 0, $ary_1 = array(); $i $ary_1[ ] = rand(100, 999);

  39. }

  40. for($i = 0, $ary_2 = array(); $i $ary_2[] = rand(100, 999);

  41. }

  42. header("Content-type: text/plain;charset=utf-8");

  43. $ time_start = microtime_float();

  44. array_diff($ary_1, $ary_2);
  45. echo "関数 array_diff run" . (microtime_float() - $time_start) . " 秒 n";

  46. $time_start = microtime_float();

  47. array_diff2($ary_1, $ary_2);
  48. echo "関数 array_diff2 が実行されます" . (microtime_float() - $time_start) " 秒 n";

  49. $time_start = microtime_float ();

  50. array_diff3($ary_1, $ary_2);
  51. echo "関数 array_diff3 が実行されます" . (microtime_float() - $time_start) "秒";

  52. $time_start = microtime_float( );

  53. array_diff4($ary_1, $ary_2);
  54. echo "関数 array_diff4 run" . (microtime_float() - $time_start) . "秒";
  55. ?

コードをコピーします

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!