关于数组的比较,请大神们帮忙看看。
PHP如何对多维数组进行比较?实现类似一维数组比较函数 array_diff的功能?
也就是认为 array(a,b,c)和 array(c,b,a) 是两个一样的数组?
我想比较的数组结构比较复杂,可能是 3~4个维度,举个例子
$arr1 = array( 'hwres'=>array( 'cpu'=>array('brief'=>'intel core II i7-2620M @2.7GHZ double'), 'nainboard'=>array('brief'=>'lenvo 4180RW2 intel QM67'), 'memory'=>array('brief'=>'samsang DDR3 1333MHz 4GB'), 'monitor'=>array('brief'=>'youda AUO223E 14'), 'netcard'=>array( array('type'=>'有线网卡','brief'=>'intel 82579LM Gigabit network connection'), array('type'=>'无线网卡','brief'=>'瑞昱 RTL8188CE wireless lan 802.11n PCI-E MIC') )), 'softres'=>array( 'os'=>'windows7 64 home', 'sp'=>'sp3', 'kb'=>array( array('name'=>'KB11111'), array('name'=>'KB11112'), array('name'=>'KB11113')), 'software'=>array( array('name'=>'QQ2013','version'=>'1.92.6970.0','time'=>"2013/7/4"), array('name'=>'sougou输入法','version'=>'6.7.0.0747','time'=>'2013/7/4') ) ) ); $arr2 = array( 'hwres'=>array( 'cpu'=>array('brief'=>'intel core II i7-2620M @2.7GHZ double'), 'nainboard'=>array('brief'=>'lenvo 4180RW2 intel QM67'), 'memory'=>array('brief'=>'samsang DDR3 1333MHz 4GB'), 'monitor'=>array('brief'=>'youda AUO223E 14'), 'netcard'=>array( array('type'=>'有线网卡','brief'=>'intel 82579LM Gigabit network connection'), array('type'=>'无线网卡','brief'=>'瑞昱 RTL8188CE wireless lan 802.11n PCI-E MIC') )), 'softres'=>array( 'os'=>'windows7 64 home', 'sp'=>'sp3', 'kb'=>array( array('name'=>'KB11111'), array('name'=>'KB11113'), array('name'=>'KB11112')), 'software'=>array( array('name'=>'sougou输入法','time'=>'2013/7/4','version'=>'6.7.0.0747'), array('name'=>'QQ2013','version'=>'1.92.6970.0','time'=>"2013/7/4") ) ) );
上面两个数组的比较结果应该是一样的
只是array('name'=>'KB11113')和array('name'=>'KB11112')的位置对调了一下
array('name'=>'sougou输入法','time'=>'2013/7/4','version'=>'6.7.0.0747')和array('name'=>'QQ2013','version'=>'1.92.6970.0','time'=>"2013/7/4")对调了一下,并且搜狗输入法内的内容对调了一下,但是值都是没有改变的,有什么好的办法,解决这个问题么,PHP 什么时候会有集合的概念和相关操作函数呢?
回复讨论(解决方案)
能否实现array_diff 类似的效果呢,如果一样就返回空数组,如果不一样,就返回差集
print_r(array_diff_recursive($arr1, $arr2));print_r(array_diff_recursive($arr2, $arr1));function array_diff_recursive($a, $b) { $res = array(); if(is_numeric(key($a))) { //如果是下标数组,处理上还不尽如人意 foreach($a as $s) { $r = false; foreach($b as $k=>$v) { if($s == $v) { unset($b[$k]); $r = true; break; } } if(! $r) $res[] = $s; } return $res; } foreach(array_diff(array_keys($a),array_keys($b)) as $k) $res[$k] = $a[$k]; if($res) return $res; foreach($a as $k=>$v) { if($v == $b[$k]) continue; if(is_array($v)) { if($t = call_user_func_array( __FUNCTION__, array($v, $b[$k]))) $res[$k] = $t; }else $res[$k] = $v; } return $res;}
换个算法
function array_diff_recursive($a, $b, &$res=array()) { if($a == $b) return $res = array(); $res = $a; if(is_array($a)) { foreach($a as $k=>$v) { if(is_numeric($k)) { foreach($b as $i=>$t) if($v == $t) unset($res[$k]); }else { if(isset($b[$k])) array_diff_recursive($a[$k], $b[$k], $res[$k]); } } } if(is_array($res)) foreach($res as $k=>$v) if($v == array()) unset($res[$k]); return $res;}
print_r(array_diff_recursive($arr1, $arr2));print_r(array_diff_recursive($arr2, $arr1));function array_diff_recursive($a, $b) { $res = array(); if(is_numeric(key($a))) { //如果是下标数组,处理上还不尽如人意 foreach($a as $s) { $r = false; foreach($b as $k=>$v) { if($s == $v) { unset($b[$k]); $r = true; break; } } if(! $r) $res[] = $s; } return $res; } foreach(array_diff(array_keys($a),array_keys($b)) as $k) $res[$k] = $a[$k]; if($res) return $res; foreach($a as $k=>$v) { if($v == $b[$k]) continue; if(is_array($v)) { if($t = call_user_func_array( __FUNCTION__, array($v, $b[$k]))) $res[$k] = $t; }else $res[$k] = $v; } return $res;}
唠叨老大太牛了。。。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

使用foreach循环去除PHP数组中重复元素的方法如下:遍历数组,若元素已存在且当前位置不是第一个出现的位置,则删除它。举例而言,若数据库查询结果存在重复记录,可使用此方法去除,得到不含重复记录的结果。

PHP中深度复制数组的方法包括:使用json_decode和json_encode进行JSON编码和解码。使用array_map和clone进行深度复制键和值的副本。使用serialize和unserialize进行序列化和反序列化。

PHP数组键值翻转方法性能对比表明:array_flip()函数在大型数组(超过100万个元素)下比for循环性能更优,耗时更短。手动翻转键值的for循环方法耗时相对较长。

多维数组排序可分为单列排序和嵌套排序。单列排序可使用array_multisort()函数按列排序;嵌套排序需要递归函数遍历数组并排序。实战案例包括按产品名称排序和按销售量和价格复合排序。

在PHP中执行数组深度复制的最佳实践是:使用json_decode(json_encode($arr))将数组转换为JSON字符串,然后再将其转换回数组。使用unserialize(serialize($arr))将数组序列化为字符串,然后将其反序列化为新数组。使用RecursiveIteratorIterator迭代器对多维数组进行递归遍历。

PHP的array_group_by函数可根据键或闭包函数对数组中的元素分组,返回一个关联数组,其中键是组名,值是属于该组的元素数组。

PHP是一种常用的服务器端脚本语言,广泛应用于网站开发和数据处理领域。在PHP中,对数组中的值进行大小排序是很常见的需求。通过使用内置的排序函数,可以很方便地实现对数组的排序操作。下面将介绍如何使用PHP对数组中的值进行大小排序,并附上具体的代码示例:1.对数组中的值进行升序排序:

PHP的array_group()函数可用于按指定键对数组进行分组,以查找重复元素。该函数通过以下步骤工作:使用key_callback指定分组键。可选地使用value_callback确定分组值。对分组元素进行计数并识别重复项。因此,array_group()函数对于查找和处理重复元素非常有用。
