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() 删除数组重复元素
原文:http://www.jb51.net/article/17104.htm
在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)); 
=============================================

转载于:https://www.cnblogs.com/voiphudong/p/3366277.html

php array_flip() 删除数组重复元素——大彻大悟相关推荐

  1. 前端面试高频题:删除数组重复元素的多种方法

    最近在想着换工作,去了一家中关村的上市公司,面试官随便问了几个问题其中就提到了怎么删除数组元素的方法,表示这已经是第三次遇到了这个问题了,由于知识口头说说所以就随便说了下,之前用的时候都是直接找的方法 ...

  2. c语言删除数组重复元素并升序,C语言编程题: 编写函数,从一个已经排序的数组中删去某数后,该数组仍然有序....

    满意答案 nanhrui57q 2014.01.10 采纳率:57%    等级:12 已帮助:8634人 #include #include int compear(void *, void *); ...

  3. 原地移除数组重复元素问题总结

    原地移除数组重复元素问题总结 注:本文章中的总结和源代码均来自labuladong的算法秘籍,写下此文的目的仅是为了自己复习所用.版权归原作者所有.如有侵权,请联系删除. 类型一:有序数组/链表去重 ...

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

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

  5. php 删除数组的空元素,php删除数组空元素的方法_后端开发

    php如何实现自动跳转_后端开发 php实现自动跳转的方法:1.通过php内置函数"header",将http响应头中的"Location"设置为要跳转的URL ...

  6. php 递归到空如何处理,php递归调用删除数组空值元素的方法

    这篇文章主要介绍了php递归调用删除数组空值元素的方法,涉及php递归调用操作数组的相关技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了php递归调用删除数组空值元素的方法.分享给大家供大 ...

  7. Javascript循环删除数组中元素的3种方法

    本文主要跟大家分享了关于Javascript循环删除数组中元素的几种方法,分享出来供大家参考学习,下面与微点阅读小编一起来看看详细的介绍: 问题 大家在码代码的过程中,经常会遇到在循环中移除指定元素的 ...

  8. javascript比较删除数组头元素的不同方法的效率

    javascript比较删除数组头元素的不同方法的效率 Array.prototype.shift() 删除并返回数组的第一个元素 我搜索的实现是,创建一个新数组,然后对从i=1开始,对新数组的i-1 ...

  9. php删除数组特定元素,PHP删除数组特定元素的实现方法

    这篇文章主要为大家详细介绍了PHP删除数组特定元素的实现方法,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小玲来看看吧! 方法一: 代码如下: /* 512笔记 w ...

最新文章

  1. 12月第三周安全要闻回顾:浏览器安全不容忽视,SSL弱点影响网站安全
  2. 深度学习难,这本书让你轻松学深度学习
  3. 为什么安装的是gpu版本训练时还是用的cpu?_免费GPU哪家强?谷歌Kaggle vs. Colab | 硬核评测...
  4. ubuntu下编译php扩展的时候报缺少pcre解决办法
  5. PHP中session的工作原理
  6. java wifi监听_Android 监听 WiFi 开关状态
  7. 华为鸿蒙等不急了,华为最强巨作,鸿蒙OS+六摄+麒麟985,网友:等不及了!
  8. 数据结构-图及其遍历
  9. 超级终端工具_【招商通信余俊团队】智能网联汽车发展提速,科技巨头跑步入场,有望成为新一代超级终端——招商通信周周谈(2020年第48周)...
  10. 最小二乘法移动最小二乘法
  11. Kinect SDK v1.7 新特性、交互框架与新概念
  12. 内部存储空间不足_手机存储空间不足,教你快速解决
  13. 【web素材】12—1500个+Javascript特效代码资源打包下载
  14. 基于Java+Springboot+mybatis+lyaui的学科竞赛管理系统设计和实现
  15. 批量替换文件字体,简体-繁体
  16. 简述冯诺依曼体系结构计算机的工作原理。
  17. 编译原理中单线箭头->和双线箭头=>有什么区别
  18. 独立思考者的思考模型----智商160以上的人都应该学会的(摘自杜牛牛博客)
  19. 表单_内置Filed
  20. java配置文件起名规范_Mybatis注解和配置文件命名规范所引发的问题

热门文章

  1. delete容易出错的地方
  2. Arp Scan和局域网隐身
  3. c语言的point函数,C语言中friend友元函数详细解析
  4. sublime c 语言 编译,默认情况下,将程序编译为Sublime Text 3中的c 14
  5. 11静态static
  6. html获取随机字母,JavaScript实现4位随机验证码的生成
  7. name选择器_CSS 选择器
  8. Java 算法 入学考试
  9. python实现人脸识别比对_人脸识别并比对实现(基于face_recognition)
  10. numpy生成服从特定分布(制定分布)的数据