2012-01-01 135 views
11

所以這是什麼讓我感到困擾。PHP - 如何比較兩個數組並刪除重複的值

我有兩個數組:

$array1 = array('[param1]' ,'demo' ,'[param2]' ,'some' ,'[param3]'); 
$array2 = array('value1' ,'demo' ,'value2' ,'some' ,'value3'); 

現在我想比較這兩個數組,並刪除所有重複值。
最後我想要這兩個數組,但沒有「demo」和「some」值。
我想從數組中刪除所有具有相同索引鍵和值的值。
數組總是有相同數量的值和索引,我只想比較它們並從兩者中刪除具有相同索引鍵和值的條目。

我現在做這樣的事情:

$clean1 = array(); 
$clean2 = array();  

foreach($array1 as $key => $value) 
{ 
    if($value !== $array2[$key]) 
    { 
     $clean1[$key] = $value; 
     $clean2[$key] = $array2[$key]; 
    } 
} 

var_export($clean1); 
echo "<br />"; 
var_export($clean2); 

而這個作品!但即時通訊想知道有沒有其他方式做到這一點?也許沒有使用foreach循環?有沒有更優雅的方式來做到這一點?

+3

你能定義什麼是「優雅」嗎?我在這裏看到沒有問題... – nmagerko 2012-01-01 01:04:46

+3

這總是需要線性搜索。在這方面,您的解決方案是最有效的解決方案。 – You 2012-01-01 01:05:46

回答

21
array_unique(array_merge($arr_1, $arr_2)); 

,或者你可以這樣做:

$arr_1 = array_diff($arr_1, $arr_2); 
$arr_2 = array_diff($arr_2, $arr_1); 

我猜...

+0

謝謝!第二個是「優雅」!但是,array_diff會取消arr_1中不存在於$ arr_2中的鍵,並使用不按順序的鍵返回該數組。這對我來說可能是一個問題:(我需要從0開始的新數組:S有沒有辦法重置數組鍵,如果我有像0,3,7這樣的鍵,我可以將它們重置爲1,2, 3如果不是Il joust堅持使用第一個foreach循環 – Limeni 2012-01-01 01:22:26

+4

$ arr_1 = array_values($ arr_1);應該可以工作 – 2012-01-01 01:30:49

+0

yup不錯,不能迭代愚蠢的PHP重循環xD – 2012-01-01 01:36:27

4

您可以使用PHP函數和array_diff將返回以及包含該之間的相同鍵數組兩個陣列。

$clean1 = array_diff($array1, $array2); 

http://php.net/manual/en/function.array-diff.php

+0

謝謝!第二個是「優雅」! ,它array_diff從arr_1中取消了$ arr_2中不存在的鍵,這對我來說可能是一個問題:(我需要從0開始的新數組:S是否有任何方法可以重置數組鍵,如果我有鍵爲0 ,3,7,我可以將它們重置爲1,2,3? – Limeni 2012-01-01 01:23:36

0

由於$array1$array2總是相同的長度,你可以做這樣的事情:

<?php 

    $array1 = array('[param1]' ,'demo' ,'[param2]' ,'some' ,'[param3]'); 
    $array2 = array('value1' ,'demo' ,'value2' ,'some' ,'value3'); 

    $map = array_combine($array1,$array2); 
    $map = array_filter($map ,function ($item) use (&$map) { 
     $keep_data = ($item != key($map)); 
     next($map); 
     return $keep_data; 
    }); 

    $clean1 = array_keys($map); 
    $clean2 = array_values($map); 

    var_export($clean1); 
    echo "<br />"; 
    var_export($clean2); 

?> 

是更好?你決定

+0

對於我來說,這一個更復雜一點,我認爲我是用foreach循環做的矯枉過正,但它看起來就是這樣做的最好方式。至少對我來說,對於你來說這個可以更清晰些。感謝評論! – Limeni 2012-01-01 01:31:23

+1

Yup ...同意......並且它也慢3倍:) – Dancrumb 2012-01-02 16:57:52

0

那麼?

$res = array_diff($array1, $array_intersect($array1, $array2)); 
$reindexed = array_combine(array_keys($res), array_values($res)); 

或者乾脆如果方法不需要鑰匙

array_values(array_diff($array1, $array_intersect($array1, $array2))); 
1
$clean1 = array_diff($array1, $array2); 
$clean2 = array_diff($array2, $array1); 
$final_output = array_merge($clean1, $clean2); 
+1

請添加一些解釋,讓人們可以瞭解爲什麼這個工程 – jou 2015-03-02 01:05:22

0

您的解決方案絕對是最「優雅」(意爲最簡單的閱讀,至少代碼量),但在這裏是另一種使用array_diff_ukey()的解決方案。它會保留這些密鑰,並按照您的要求將它們按增量順序放置。

$array1 = ['[param1]' ,'demo' ,'[param2]' ,'some' ,'[param3]']; 
$array2 = ['value1' ,'demo' ,'value2' ,'some' ,'value3']; 

$clean1 = $array1; 

$clean2 = array_diff_ukey(
    $array2, 
    $array1, 
    // Need to have "&" so the values get set. 
    function($a, $b) use (&$clean1, $array1, $array2) { 

     // Use isset() just in case keys are not identical 
     // or arrays are not the same length. 
     if (isset($array2[$b]) && $array2[$b] === $array1[$b]) { 
      unset($clean1[$b]); 
     } 

     return strcmp($array2[$a], $array1[$b]); 

}); 

print_r($clean1); 
print_r($clean2); 

將返回此:

Array 
(
    [0] => [param1] 
    [2] => [param2] 
    [4] => [param3] 
) 
Array 
(
    [0] => value1 
    [2] => value2 
    [4] => value3 
) 

工作實例here

相關問題