2011-05-17 58 views
3

我想問你的幫助,因爲我很難解決這個問題。我創建了一個函數來簡化數組比較,但它不足以滿足我的需求。感謝和更多的權力!PHP - Mutidimensional array diff

<?php 
    $arraySession = array(
     'sampleA' => array('1', '2', '3'), 
     'sampleB' => array('1', '2', '3'), 
    ); 

$arrayPost = array(
    'sampleA' => array('1'), 
    'sampleB' => array('1','2'), 
); 

的結果應該是:

array(
    'sampleA' => array('2', '3') 
    'sampleB' => array('3'), 
) 

我現有的功能:

public function array_diff_multidimensional($session, $post) { 
     $result = array(); 
     foreach($session as $sKey => $sValue){ 
      foreach($post as $pKey => $pValue) { 
       if((string) $sKey == (string) $pKey) { 
        $result[$sKey] = array_diff($sValue, $pValue); 
       } else { 
        $result[$sKey] = $sValue; 
       } 
      } 
     } 
     return $result; 
    } 

任何幫助,將不勝感激!快樂的編碼!

回答

3

不是我的功能,而不是由我測試過,但是這是在php.net/array_diff第一個評論(歸功於在Gmail的點com到thefrox)

<?php 
function multidimensional_array_diff($a1, $a2) { 
    $r = array(); 

    foreach ($a2 as $key => $second) { 
     foreach ($a1 as $key => $first) { 
      if (isset($a2[$key])) { 
       foreach ($first as $first_value) { 
        foreach ($second as $second_value) { 
         if ($first_value == $second_value) { 
          $true = true; 
          break; 
         } 
        } 
        if (!isset($true)) { 
         $r[$key][] = $first_value; 
        } 
        unset($true); 
       } 
      } else { 
       $r[$key] = $first; 
      } 
     } 
    } 
    return $r; 
} 
?> 
+0

感謝dtbarne,IM要去嘗試。 – 2011-05-17 05:17:49

+0

看起來它只能處理一個陣列。 – alex 2011-05-17 05:24:32

+0

hi dtbarne,使用此函數不會獲得預期的結果。嘗試:$ arraySession = array( 'sampleA'=> array('1','2','3'), 'sampleB'=> array('1','2','3'), ); $ arrayPost =陣列( \t 'sampleA'=>數組( '1', '2', '3'), \t 'sampleB'=>數組( '1',), ); – 2011-05-17 05:28:11

1

你想要的東西或多或少像這樣:

public function array_diff_multidimensional($arr1, $arr2) { 
    $answer = array(); 
    foreach($arr1 as $k1 => $v1) { 
     // is the key present in the second array? 
     if (!array_key_exists($k1, $arr2)) { 
      $answer[$k1] = $v1; 
      continue; 
     } 

     // PHP makes all arrays into string "Array", so if both items 
     // are arrays, recursively test them before the string check 
     if (is_array($v1) && is_array($arr2[$k1])) { 
      $answer[$k1] = array_diff_multidimensional($v1, $arr2[$k1]); 
      continue; 
     } 

     // do the array_diff string check 
     if ((string)$arr1[$k1] === (string)$arr2[$k1]) { 
      continue; 
     } 

     // since both values are not arrays, and they don't match, 
     // simply add the $arr1 value to match the behavior of array_diff 
     // in the PHP core 
     $answer[$k1] = $v1; 
    } 

    // done! 
    return $answer; 
} 
+0

感謝盧克,我會試試這個。 – 2011-05-17 05:19:17

+0

我試過使用這個,並不會採購預期的結果。嘗試:$ arraySession = array( 'sampleA'=> array('1','2','3'), 'sampleB'=> array('1','2','3'), ); $ arrayPost =陣列( \t 'sampleA'=>數組( '1', '2', '3'), \t 'sampleB'=>數組( '1',), ); – 2011-05-17 05:29:34

+0

Whups。由於任何對字符串的數組類型轉換都只是「數組」(我忘記了PHP的日子),所有數組都被認爲是相等的。我將數組檢查移到了字符串檢查之前,現在它可以工作(並且可以與n維數組一起啓動)。 – 2011-05-17 14:55:41

1

這應該這樣做,假定所有的鍵出現在兩個數組:

$diff = array(); 
foreach ($session as $key => $values) { 
    $diff[$key] = array_diff($values, $post[$key]); 
} 

或者說,是因爲我很無聊和array_map利用不足:(儘管假設以及有序排列)

$diff = array_combine(
    array_keys($session), 
    array_map(function ($a, $b) { return array_diff($a, $b); }, $session, $post) 
); 

+0

請澄清你的問題中的提示和邊緣案例。我甚至不確定你的意思是「二維」還是真正的「多維」。 – deceze 2011-05-17 05:37:32