有关php数组遍历的差异(array_diff应用举例)

WBOY
Libérer: 2016-07-25 08:58:38
original
852 Les gens l'ont consulté
  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. ?>
复制代码

以上代码的实现,有点牵强。 于是我又重新考虑了下,并优化了算法,第二个函数看起来是这个样子的:

  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 组织的,查找很快; 而 Value 只是由 Key 组织存放,本身没有索引,每次查找都是遍历。总结 这虽然是 PHP 语言的一个小窍门,但在遍历和对比数组的值上,如果需要对比值将其与键反转的确比通常的值对值的比较效率要高得多。

比如,上面的函数二需要调用 in_array 函数需要循环判断是否在函数内;而函数三则仅仅判断这个数组是否存在该键就可以了。加上数组键和值不同的组织索引方式,效率比想象的还高那就非常可以理解了。

完整代码如下:

  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. }
  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 运行" . (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) . " 秒\n";
  52. $time_start = microtime_float();

  53. array_diff4($ary_1, $ary_2);
  54. echo "函数 array_diff4 运行" . (microtime_float() - $time_start) . " 秒\n";
  55. ?>
复制代码


source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!