關於數組的比較,請大神們幫忙看看。

來源:互聯網
上載者:User
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;}


嘮叨老大太牛了。。。
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.