深思 PHP 数组遍历的差异(array_diff 的实现)

function array_diff($array_1, $array_2) { 
    $diff = array();

foreach ($array_1 as $k => $v1) { 
        $flag = false; 
        foreach ($array_2 as $v2) { 
            if ($flag = ($v1 == $v2)) { 
                break; 
            } 
        }

if (!$flag) { 
            $diff[$k] = $v1; 
        } 
    }

return $diff; 
}虽然实现是可以的,但是发现这个函数的效率是惨不忍睹。于是我又重新考虑了下,并优化了算法,第二个函数看起来是这个样子的:

function array_diff($array_1, $array_2) { 
    foreach ($array_1 as $key => $item) { 
        if (in_array($item, $array_2, true)) { 
            unset($array_1[$key]); 
        } 
    }

return $array_1; 
}嗯,这次几乎可以和原 array_diff 函数的速度媲美了。但是还有没有更优化的办法呢?由 ChinaUnix 上的一篇文章(不好意思,作弊了),我发现 PHP 竟然可以这样写:

function array_diff($array_1, $array_2) { 
    $array_2 = array_flip($array_2); 
    foreach ($array_1 as $key => $item) { 
        if (isset($array_2[$item])) { 
            unset($array_1[$key]); 
        } 
     }

return $array_1; 
}这个函数的效率非常的惊人,甚至比原 array_diff 函数的速度都要快。究其原因,我找到了解释:

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

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

时间: 2024-10-24 16:25:21

深思 PHP 数组遍历的差异(array_diff 的实现)的相关文章

php数组遍历的差异(array_diff)实现

初次接到这个题目,我发现这非常的简单,于是按照以往的经验"随便"写了一个: function array_diff($array_1, $array_2) {    $diff = array();    foreach ($array_1 as $k => $v1) {        $flag = false;        foreach ($array_2 as $v2) {            if ($flag = ($v1 == $v2)) {          

输出 一维数组中最大的数+数组遍历

1 //将数组中最大的数输出 2 //数组遍历 3 int[] arr = new int[]{2,4,1,6,10,11}; 4 System.out.println("输出一维数组 :"); 5 for(int i=0; i<arr.length;i++) 6 { 7 System.out.print(arr[i]+" "); 8 } 9 10 System.out.println(); 11 12 int max = arr[0]; 13 for(int

微信小程序多层嵌套循环,二级数组遍历

小程序中的遍历循环类似于angularJS的遍历. 二级数组遍历有一个坑.二级遍历wx:for循环的时候,需要注意.(代码如下) JS代码: data: { groups: [ [ { title: '狼图腾', cover: '../../img/mineBG.png' }, { title: '狼图腾', cover: '../../img/mineBG.png' }, ], [ { title: '狼图腾', cover: '../../img/mineBG.png' }, ], [ {

iOS中数组遍历的方法及比较

数组遍历是编码中很常见的一种需求,我们来扒一拔iOS里面都有什么样的方法来实现,有什么特点. 因为iOS是兼容C语言的,所以C语言里面的最最常见的for循环遍历是没有问题的. 本文中用的数组是获取的系统的语言数组,大约有30多个数据,虽然还不够模拟大批量的数据,但对于方法的验证是没有问题的了. NSArray *langArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"AppleLanguages"]; 第一种方法

PHP数组遍历详解

一.PHP数组简介 1.PHP数组的分类 按照下标的不同分为关联数组和索引数组①索引数组:下标从0开始依次增长②关联数组:下标为字符串格式,每个下标字符串与数组的值一一对应,(有点像对象的键值对) 下面详细介绍下索引数组与关联数组 ①.数组中可以同时存在索引数组和关联数组:②.数组中所有的索引数组如果不加指定会去掉关联项,默认增长:关联数组不占索引位     array(1,2,"one"=>3,4,5); //1/2/4/5的索引-->0,1,2,3③.如果关联数组的ke

二维数组遍历

问题描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 算法分析:可以直接遍历,不过时间复杂度太高,因为有序,可以从左下角查找,也可以从右上角查找. public class Array { //二维数组遍历 public boolean Find(int [][] array,int target) { for(int i = 0; i < array.length; i

2016/1/10 作业 1, 二维数组遍历输出求和 2,转置运算???? 3,九宫格?? 后两个存在问题

1 public class arr1 { 2 3 4 public static void main(String[] args) { 5 // 创建二维数组arr[][],输出二维数组所有元素的和. 6 7 int arr[][]={{1,3,5,7,9},{21,23,25,27,29}, 8 {12,14,16,18},{32,34,36,38}}; 9 int sum=0; 10 System.out.println("二维数组遍历"); 11 // for循环 遍历 求和

转 :asp教程.net c#数组遍历、排序、删除元素、插入、随机元素 数组遍历

asp教程.net c#数组遍历.排序.删除元素.插入.随机元素数组遍历 short[] sts={0,1,100,200};for(int i=0;i<sts.lenght;i++){  if(sts[i]>50) {  .....  }} 数组随机元素 public  hashtable  noorder(int count)         {             arraylist mylist = new arraylist();             hashtable ha

Javascript数组和php数组遍历对比介绍

javascripe 和 php 的数组都是 map 类型的,也就是 key 值类型不限制那种.下面我对比下俩种数组的遍历方式: 1 : javascript数组遍历使用了 in 这个操作符,例如 for(key in arr),则遍历过程中 key 会被赋值为 arr 数组中的key,通过 arr[key] 获取 value. for(key in arr){ console.log("arr[" + key + "] = " + arr[key]); } 2:p