2012-01-01 56 views
11

Vì vậy, đây là những gì làm phiền tôi.PHP - Cách so sánh hai mảng và loại bỏ các giá trị trùng lặp

Tôi có hai mảng:

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

Bây giờ tôi muốn so sánh các mảng hai, và loại bỏ tất cả các giá trị trùng lặp.
Cuối cùng tôi muốn hai mảng này nhưng không có giá trị 'demo' và 'some' trong chúng.
Tôi muốn xóa tất cả các giá trị khỏi các mảng có cùng giá trị và khóa chỉ mục.
Mảng sẽ luôn có cùng số giá trị và chỉ mục, tôi chỉ muốn so sánh chúng và xóa các mục có cùng một chỉ mục và giá trị, từ cả hai giá trị và chỉ mục.

tôi đang làm một cái gì đó như thế này bây giờ:

$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); 

Và làm việc này! Nhưng tôi tự hỏi có cách nào khác để làm điều này không? Có lẽ không sử dụng vòng lặp foreach? Có cách nào thanh lịch hơn để làm điều này?

+3

Bạn có thể xác định những gì "thanh lịch" dành cho bạn không? Tôi thấy không có vấn đề ở đây ... – nmagerko

+3

Điều này luôn đòi hỏi phải tìm kiếm tuyến tính. Về vấn đề đó, giải pháp của bạn là giải pháp hiệu quả nhất. – You

Trả lời

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

hoặc bạn có thể làm:

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

tôi đoán ...

+0

Cảm ơn! Thứ hai là "thanh lịch"! Nhưng, array_diff bỏ các khóa từ arr_1 không có trong $ arr_2 và trả về mảng đó với các khóa không theo thứ tự.Và điều này có thể là một vấn đề đối với tôi: (Tôi cần mảng mới bắt đầu từ 0: S Có cách nào để đặt lại các phím mảng, nếu tôi có các phím như 0, 3, 7, tôi có thể đặt lại chúng thành 1,2 không, 3? Nếu không Il joust dính với vòng lặp foreach đầu tiên – Limeni

+4

$ arr_1 = array_values ​​($ arr_1); nên làm việc –

+0

yup khá tốt không để lặp qua các vòng nặng của PHP ngu ngốc xD –

4

Bạn có thể sử dụng chức năng array_diff trong PHP mà sẽ trở lại và mảng chứa các phím giống nhau giữa hai mảng.

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

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

+0

Cảm ơn! Thứ hai là "thanh lịch"! , nó array_diff unsets các khóa từ arr_1 mà không có trong $ arr_2.Và điều này có thể là một vấn đề đối với tôi: (Tôi cần mảng mới bắt đầu từ 0: S Có cách nào để thiết lập lại các phím mảng, nếu tôi có các phím như 0 , 3, 7, tôi có thể thiết lập lại chúng là 1,2,3? – Limeni

0

Kể từ $array1$array2 luôn cùng độ dài, bạn có thể làm một cái gì đó như thế này:

<?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); 

?> 

Là nó tốt hơn? Bạn quyết định

+0

Whooh, với tôi cái này phức tạp hơn Tôi nghĩ tôi đã làm quá mức với vòng lặp foreach nhưng có vẻ như đó là cách tốt nhất để làm điều đó. ít nhất cho tôi, cho bạn cái này có thể rõ ràng hơn. Cảm ơn bạn đã bình luận! – Limeni

+1

Yup ... đồng ý ... và nó cũng chậm hơn 3 lần :) – Dancrumb

0

còn về điều gì?

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

hoặc đơn giản là cách nếu phím không cần thiết

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

Vui lòng thêm một số giải thích để mọi người có thể tìm hiểu lý do tại sao tính năng này hoạt động – jou

0

giải pháp của bạn chắc chắn là hầu hết các "thanh lịch" (có nghĩa là dễ dàng nhất để đọc, và ít nhất lượng mã), nhưng ở đây là một giải pháp khác sử dụng array_diff_ukey(). Nó bảo tồn các khóa và đặt chúng theo thứ tự tăng dần, như bạn đã yêu cầu.

$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); 

Sẽ trở lại này:

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

dụ here làm việc.

Các vấn đề liên quan