1. php array_flip() 删除数组重复元素,如果用于一维索引数组,好理解。
[root@BG-DB:~]$more arr.php 
<?php
        $arr = array('a','b','c','a','b','b');
        var_dump(array_flip( array_flip($arr) ));
 
 
?>
[root@BG-DB:~]$
[root@BG-DB:~]$php arr.php 
array(3) {
  [3]=>
  string(1) "a"
  [5]=>
  string(1) "b"
  [2]=>
  string(1) "c"
}
[root@BG-DB:~]$
说明:
1)array_unique() 也可以达到相同的目的,但是据说array_unique()效率很低,远不及array_flip()
2) 据测试,上述两个函数都一般不可以用于二维数组或者关联数组,否则结果未知,例如:
当用array_unique()用于关联数组的时候,系统应该是简单的执行了索引覆盖,所以后面的元素会覆盖前面的元素。而往往需要前面的元素不被覆盖,后面的元素丢弃。
[root@BG-DB:~]$more arr.php 
<?php
        $arr = array('a'=>123,'b'=>456,'c'=>'def','a'=>123,'b'=>'ccc','c'=>'abc');
        var_dump(array_unique($arr));
 
?>
[root@BG-DB:~]$php arr.php 
array(3) {
  ["a"]=>
  int(123)
  ["b"]=>
  string(3) "ccc"
  ["c"]=>
  string(3) "abc"
}
[root@BG-DB:~]$
理论上如果用array_flip()执行前面的例子,就会出问题了,因为索引键值不会是一个数组。但是事实上结果确和上面一样,也是后面的覆盖前面的,可以理解。如下:
[root@BG-DB:~]$more arr.php 
<?php
        $arr = array('a'=>123,'b'=>456,'c'=>'def','a'=>123,'b'=>'ccc','c'=>'abc');
        var_dump(array_flip(array_flip($arr)));
 
 
?>
[root@BG-DB:~]$
[root@BG-DB:~]$php arr.php 
array(3) {
  ["a"]=>
  int(123)
  ["b"]=>
  string(3) "ccc"
  ["c"]=>
  string(3) "abc"
}
[root@BG-DB:~]$
但是,当数组维数变多的时候,上面的函数就有点难理解了,但是道理都是:后面的覆盖前面的方法去重。如下:
[root@BG-DB:~]$more arr.php 
<?php
        $arr = array('a'=>123,'b'=>Array("x"=>"a","y"=>'b'),'c'=>'def','a'=>123,'b'=>'ccc','c'=>'abc');
        var_dump(array_flip(array_flip($arr)));
 
 
?>
[root@BG-DB:~]$php arr.php  
array(3) {
  ["a"]=>
  int(123)
  ["b"]=>
  string(3) "ccc"
  ["c"]=>
  string(3) "abc"
}
[root@BG-DB:~]$
 
 
===============================
 
后来干脆自己写了个多维去重的函数,是前面出现的元素不被后面覆盖,还是运行有问题。
对于下面的数组,也就是数值键值还是一个数组,array_flip()和array_unique()就显得黔驴技穷了,如下:
[root@BG-DB:~]$more arr.php 
<?php
        $arr = Array( 
Array("user"=>"wjj","age"=>20),
Array("user"=>"wu","age"=>21),
Array("user"=>"jun","age"=>22),
Array("user"=>"wu","age"=>20000),
Array("user"=>"jie","age"=>23),
Array("user"=>"wjj","age"=>200),
);
        var_dump(array_flip(array_flip($arr)));
        //var_dump(array_unique($arr));
 
 
?>
[root@BG-DB:~]$php arr.php  
PHP Warning:  array_flip(): Can only flip STRING and INTEGER values! in /root/arr.php on line 10
PHP Warning:  array_flip(): Can only flip STRING and INTEGER values! in /root/arr.php on line 10
PHP Warning:  array_flip(): Can only flip STRING and INTEGER values! in /root/arr.php on line 10
PHP Warning:  array_flip(): Can only flip STRING and INTEGER values! in /root/arr.php on line 10
PHP Warning:  array_flip(): Can only flip STRING and INTEGER values! in /root/arr.php on line 10
PHP Warning:  array_flip(): Can only flip STRING and INTEGER values! in /root/arr.php on line 10
array(0) {
}
[root@BG-DB:~]$
 
于是自己写了个方法,一直搞不明白运行为毛还有问题,为此和boss争论的面红耳赤,代码形如:
回来后仔细一想,就这点破事,哎!
[root@BG-DB:~]$more arr.php 
<?php
        $arr = Array( 
Array("user"=>"wjj","age"=>20),
Array("user"=>"wu","age"=>21),
Array("user"=>"jun","age"=>22),
Array("user"=>"wu","age"=>20000),
Array("user"=>"jie","age"=>23),
Array("user"=>"wjj","age"=>200),
);
 
$A = Array();
foreach($arr AS &$val){
        if( isset($A[$val['user']]) ){
                unset($val);
                //$val = Array();
                continue;
        }else{
                $A[$val['user']] = true;
        }
}
 
var_dump($arr);
?>
[root@BG-DB:~]$php arr.php 
array(6) {
  [0]=>
  &array(2) {
    ["user"]=>
    string(3) "wjj"
    ["age"]=>
    int(20)
  }
  [1]=>
  &array(2) {
    ["user"]=>
    string(2) "wu"
    ["age"]=>
    int(21)
  }
  [2]=>
  &array(2) {
    ["user"]=>
    string(3) "jun"
    ["age"]=>
    int(22)
  }
  [3]=>
  array(2) {
    ["user"]=>
    string(2) "wu"
    ["age"]=>
    int(20000)
  }
  [4]=>
  &array(2) {
    ["user"]=>
    string(3) "jie"
    ["age"]=>
    int(23)
  }
  [5]=>
  array(2) {
    ["user"]=>
    string(3) "wjj"
    ["age"]=>
    int(200)
  }
}
[root@BG-DB:~]$
上面的代码把unset($val); 改成 $val = Array(); ,后打印如下:
[root@BG-DB:~]$
[root@BG-DB:~]$php arr.php 
array(6) {
  [0]=>
  &array(2) {
    ["user"]=>
    string(3) "wjj"
    ["age"]=>
    int(20)
  }
  [1]=>
  &array(2) {
    ["user"]=>
    string(2) "wu"
    ["age"]=>
    int(21)
  }
  [2]=>
  &array(2) {
    ["user"]=>
    string(3) "jun"
    ["age"]=>
    int(22)
  }
  [3]=>
  &array(0) {
  }
  [4]=>
  &array(2) {
    ["user"]=>
    string(3) "jie"
    ["age"]=>
    int(23)
  }
  [5]=>
  &array(0) {
  }
}
[root@BG-DB:~]$
尼玛看上去好像是unset()不支持销毁一个多维数组,只支持销毁单一的原子元素,想了几次还真觉得是这个样子,后来测试发现不是,原来unset()支持一次性销毁一个多维数组,证据如下:
[root@BG-DB:~]$more arr1.php 
<?php
        $arr = Array( 
Array("user"=>"wjj","age"=>20),
Array("user"=>"wu","age"=>21),
Array("user"=>"jun","age"=>22),
Array("user"=>"wu","age"=>20000),
Array("user"=>"jie","age"=>23),
Array("user"=>"wjj","age"=>200),
);
 
unset($arr);
 
var_dump($arr);
 
 
?>
[root@BG-DB:~]$
[root@BG-DB:~]$php arr1.php 
PHP Notice:  Undefined variable: arr in /root/arr1.php on line 13
NULL
[root@BG-DB:~]$
最后仔细想想,发现原来是这样:foreach()循环,我销毁的只是临时变量$val,而并不是真正的数组元素,即使我用&引用,只是销毁了引用指针,而实际存在数组中元素还是原封不动的,后来代码改成如下,尼玛还没达到预期结果:
[root@BG-DB:~]$more arr.php 
<?php
        $arr = Array( 
Array("user"=>"wjj","age"=>20),
Array("user"=>"wu","age"=>21),
Array("user"=>"jun","age"=>22),
Array("user"=>"wu","age"=>20000),
Array("user"=>"jie","age"=>23),
Array("user"=>"wjj","age"=>200),
);
 
$A = Array();
$index = 0;
foreach($arr AS $val){
        if( isset($A[$val['user']]) ){
                unset($arr[$index]);
                continue;
        }else{
                $A[$val['user']] = true;
        }
        $index++;
}
 
var_dump($arr);
 
 
?>
[root@BG-DB:~]$php arr.php 
array(4) {
  [0]=>
  array(2) {
    ["user"]=>
    string(3) "wjj"
    ["age"]=>
    int(20)
  }
  [1]=>
  array(2) {
    ["user"]=>
    string(2) "wu"
    ["age"]=>
    int(21)
  }
  [2]=>
  array(2) {
    ["user"]=>
    string(3) "jun"
    ["age"]=>
    int(22)
  }
  [5]=>
  array(2) {
    ["user"]=>
    string(3) "wjj"
    ["age"]=>
    int(200)
  }
}
[root@BG-DB:~]$
不解,原因是当我 unset($arr[$index]); 后而我的$index自动加1,但此时数组长度确减少了,最后的一个数组元素的下标也减少,每剔除一个元素,就会跳过一个元素。上面的代码最好用komodo单步跟踪一下,不理解为什么结果是这样的。
 
最后改成如下,就可以了:
[root@BG-DB:~]$more arr.php 
<?php
        $arr = Array( 
Array("user"=>"wjj","age"=>20),
Array("user"=>"wu","age"=>21),
Array("user"=>"jun","age"=>22),
Array("user"=>"wu","age"=>20000),
Array("user"=>"jie","age"=>23),
Array("user"=>"wjj","age"=>200),
);
 
$A = Array();$arrNew = Array();
foreach($arr AS $val){
        if( isset($A[$val['user']]) ){
                continue;
        }else{
                $A[$val['user']] = true;
                $arrNew[] = $val;
        }
}
 
var_dump($arrNew);
?>
[root@BG-DB:~]$
[root@BG-DB:~]$php arr.php  
array(4) {
  [0]=>
  array(2) {
    ["user"]=>
    string(3) "wjj"
    ["age"]=>
    int(20)
  }
  [1]=>
  array(2) {
    ["user"]=>
    string(2) "wu"
    ["age"]=>
    int(21)
  }
  [2]=>
  array(2) {
    ["user"]=>
    string(3) "jun"
    ["age"]=>
    int(22)
  }
  [3]=>
  array(2) {
    ["user"]=>
    string(3) "jie"
    ["age"]=>
    int(23)
  }
}
[root@BG-DB:~]$
 
==========================================
php array_flip() 删除数组重复元素
在PHP中,用于删除数组中重复元素有一个可用的函数,那就是 array_unique(), 但是它并不是一个最高效的方法,使用array_flip() 函数将比array_uniqure()在速度上高出五倍左右。
 
方法如下: 
$arr = array(…………) ;//假设有一万个元素的数组,里面有重复的元素。 
$arr = array_flip(array_flip($arr)); //这样便可以删除重复元素。 
 
究竟是怎么回事呢?来看下array_flip()的作用:array_flip()用于将一个数组的每个元素的键和值交换,如: 
$arr1 = array (”age” => 30, “name” => “快乐园”); 
$arr2 = array_flip($arr1); //$arr2 就是 array(30 => “age”, “快乐园” => “name”); 
在PHP的数组中,允许不同的元素可以取同一个值,但不允许同一个键名被不同的元素使用,如: 
$arr1 = array (”age” => 30, “name” => “快乐园”, “age” => 20); “age” => 20将会取代”age” => 30 
$arr1 = array (”name” => “快乐园”, “age” => 45); 
这里 $arr1与$arr2 是相等的。 
于是,我们便可以知道,为什么 array_flip(array_flip($arr)) 可以删除数组中重复的元素了。首先,$arr里的值会变成键名,因为值是有重复的,变成键名之后这些重复的值便成了重复的键名,PHP引擎将重复的键名删除,只保留最后一个。如: 
$arr1 = array (”age” => 30, “name” => “快乐园”, “age” => 20); 
$arr1 = array_flip($arr1); //$arr1 变成了 array(”快乐园” => “name”, 20 => “age”); 
//再把 $arr1 的键名与值还复: 
$arr1 = array_flip($arr1); 
 
上面的代码写得简洁一些就是: $arr1 = array_flip(array_flip($arr1)); 
 
=============================================

php array_flip() 删除数组重复元素——大彻大悟的更多相关文章

  1. php array_flip() 删除数组重复元素

    在PHP中,用于删除数组中重复元素有一个可用的函数,那就是 array_unique(), 但是它并不是一个最高效的方法,使用array_flip() 函数将比array_uniqure()在速度上高 ...

  2. javascript 笔试题之删除数组重复元素

    笔试时紧张没写出来,静下心后发现简单的要死. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" & ...

  3. Js删除数组重复元素的多种方法

    js对数组元素去重有很多种处理的方法,本篇文章中为网络资源整理,当然每个方法我都去实现了:写下来的目的是希望自己活学活用,下次遇到问题后方便解决. 第一种 function oSort(arr){ v ...

  4. JavaScript删除数组重复元素的5个高效算法

    之前一段时间一直在准备面试, 因而博客太久没更新: 现在基本知识点都复习完毕, 接下来就分享下 面试的一些常见问题: 去正规的互联网公司笔试.面试有很大的概率会碰到 使用javascript实现数组去 ...

  5. JavaScript 删除数组重复元素

    unique :function (array){ var n = {}, r = [], len = array.length, val, type; for (var i = 0; i < ...

  6. 5 分钟掌握 JS 实用窍门技巧,帮你快速撸码--- 删除数组尾部元素、E6对象解构、async/await、 操作平铺嵌套多维数组等

    1. 删除数组尾部元素 一个简单方法就是改变数组的length值: const arr = [11, 22, 33, 44, 55, 66]; arr.length = 3; console.log( ...

  7. js删除数组中元素 delete 和splice的区别

    例如我有一个数组: var array = ["aa","dd","cc","aa"] ,我想删除这个数组的“dd”元素 ...

  8. js删除数组中元素的方法

    一.清空数组 var ary = [1,2,3,4]; ary.splice(0,ary.length);//清空数组 console.log(ary); // 输出 [],空数组,即被清空了 二.删 ...

  9. [Js]删除数组指定元素

    写在前面 在最近的项目中,有用到js对数组的操作,之前自己几乎没有用到这种方法,这里就记录一下,算是对学到的东西的一种总结吧. 数组对象splice方法 splice() 方法向/从数组中添加/删除项 ...

随机推荐

  1. STL标准库-一个万用的hash function

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 在前面我介绍过hash的使用,本次主要介绍一下Hash Function Hash Function即获得hash code的函 ...

  2. koa 核心源码介绍

    链接来源 Request,Context,Response  在代码运行之前就已经存在的 Request和Response自身的方法会委托到Context中. Context源码片段 var dele ...

  3. Linux更改中国时区

    执行tzselect命令-->选择Asia-->选择China-->选择east China - Beijing, ->然后输入1 再执行 ln -sf /usr/share/ ...

  4. Python 字典的增删改查

    dic = {"意大利": "李云龙","美国":"美国往事"} dic["日本"] = " ...

  5. 值得收藏的批处理程序 - imsoft.cnblogs

    文件强力删除.bat @echo off @echo 文件马上被强制删除 @echo 确定吗? pause DEL /F /A /Q \\?\%1 RD /S /Q \\?\%1 虚拟Wi-Fi.ba ...

  6. Adobe Flash Player - imsoft.cnblogs

    Adobe Flash Player是一个跨平台.基于浏览器的应用程序.运行时,它可以跨屏幕和浏览器原汁原味地查看具有表现力的应用程序.内容和视频.Flash Player实现了移动屏幕上的高性能优化 ...

  7. 51Nod 1079:中国剩余定理

    1079 中国剩余定理  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 一个正整数K,给出K Mod 一些质数的结果,求符合条件的最小的K.例如,K % ...

  8. 为什么我们不应该使用微信或者 QQ 作为团队协作的 IM 工具?

    如果你的团队没有觉得微信是低效的团队 IM 工具,那只有两种可能: 团队成员很少使用微信进行私人的生活和娱乐. 你就是一个低效的团队,而且还不自知. 本文内容 微信,连接一切 每个人都有微信 微信,低 ...

  9. .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter

    林德熙 小伙伴希望保存一个文件,并且希望如果出错了也要不断地重试.然而我认为如果一直错误则应该对外抛出异常让调用者知道为什么会一直错误. 这似乎是一个矛盾的要求.然而最终我想到了一个办法:让重试一直进 ...

  10. C#写的window服务内存溢出

    浅谈c#垃圾回收机制(GC) 写了一个window服务,循环更新sqlite记录,内存一点点稳步增长.三天后,内存溢出.于是,我从自己的代码入手,查找到底哪儿占用内存释放不掉,最终明确是调用servi ...