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'=>'sougouIME','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'=>'sougouIME','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'=>'sougouIME','time'=>'2013/7/4','version'=>'6.7.0.0747')和array('name'=>'QQ2013','version'=>'1.92.6970.0','time'=>"2013/7/4")對調了一下,並且搜狗IME內的內容對調了一下,但是值都是沒有改變的,有什麼好的辦法,解決這個問題麼,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;}
嘮叨老大太牛了。。。