2010-03-14 38 views
32

thể trùng lặp:
php multi-dimensional array remove duplicatephp nhận được giá trị duy nhất của một mảng đa chiều

Tôi có một mảng như thế này:

$a = array ( 
    0 => array ('value' => 'America',), 
    1 => array ('value' => 'England',), 
    2 => array ('value' => 'Australia',), 
    3 => array ('value' => 'America',), 
    4 => array ('value' => 'England',), 
    5 => array ('value' => 'Canada',), 
) 

Làm thế nào tôi có thể loại bỏ các giá trị nhân bản để tôi có được điều này:

$a = array ( 
    0 => array ('value' => 'America',), 
    1 => array ('value' => 'England',), 
    2 => array ('value' => 'Australia',), 
    4 => array ('value' => 'Canada',), 
) 

Tôi đã thử sử dụng array_unique, nhưng điều đó không hoạt động do mảng này là đa chiều, tôi nghĩ vậy.

Chỉnh sửa: Tôi cũng cần mảng này đa chiều và ở định dạng này, tôi không thể làm phẳng nó.

+13

Trớ trêu thay, một số bản sao: http://stackoverflow.com/search?q=php+array+duplicate –

+3

tất cả họ đang hoàn toàn khác? Chỉ cho tôi câu trả lời cho câu hỏi về mảng đa chiều. – Mark

+0

Có nhiều, một số cho mảng đa chiều, một số cho mảng một chiều. Một trong những tôi đặc biệt bình chọn để đóng trên là: http://stackoverflow.com/questions/1861682/php-multi-dimensional-array-remove-duplicate, đó là gần như chính xác cùng một câu hỏi (loại bỏ các yếu tố dựa trên một phần tử phụ giá trị). Xin vui lòng không mang nó cá nhân. Nó hoạt động tốt hơn cho SO nếu không có hàng trăm câu hỏi trùng lặp. –

Trả lời

85

array_unique là sử dụng chuyển đổi chuỗi trước khi so sánh các giá trị để tìm ra giá trị duy nhất:

Note: Hai yếu tố được coi là bằng nhau nếu và chỉ khi (string) $elem1 === (string) $elem2. Bằng chữ: khi biểu diễn chuỗi giống nhau. Phần tử đầu tiên sẽ được sử dụng.

Nhưng một mảng sẽ luôn luôn chuyển đổi sang Array:

var_dump("Array" === (string) array()); 

Bạn có thể giải quyết việc này bằng cách xác định SORT_REGULAR chế độ trong tham số thứ hai của array_unique:

$unique = array_unique($a, SORT_REGULAR); 

Hoặc, nếu không hoạt động, trước serializing các mảng trước và unserializing sau khi gọi array_unique để tìm ra giá trị duy nhất:

$unique = array_map('unserialize', array_unique(array_map('serialize', $a))); 
+0

Giải pháp tuyệt vời là tốt. cảm ơn. – Mark

+0

Đó là lý do tại sao bạn cần cờ SORT_REGULAR, để giữ mảng khỏi chuyển đổi thành chuỗi. Về lý thuyết, ít nhất. – Sejanus

+0

@ Sejanus: Đó cũng là những gì tôi nghĩ. Nhưng có vẻ như nó không hiệu quả với Mark. Vì vậy, tôi đã đề xuất một giải pháp thay thế. – Gumbo

1

Sử dụng cờ SORT_REGULAR.

$unique_array = array_unique($a, SORT_REGULAR); 

Tôi không chắc tại sao điều đó lại hữu ích. Ít nhất với php 5.3

+2

Từ tài liệu php: ** 'Lưu ý:' ** 'Lưu ý rằng array_unique() không có ý định làm việc trên mảng đa chiều.' –

+0

Ồ, tôi đang ở trên 5.2, nó không hoạt động đối với tôi. – Mark

+0

Cũng có thể bạn sẽ cần phải viết chức năng của riêng bạn trong trường hợp đó. – Sejanus

10

đây :)

<?php 
$a = array ( 
    0 => array ('value' => 'America',), 
    1 => array ('value' => 'England',), 
    2 => array ('value' => 'Australia',), 
    3 => array ('value' => 'America',), 
    4 => array ('value' => 'England',), 
    5 => array ('value' => 'Canada',), 
); 

$tmp = array(); 

foreach ($a as $row) 
    if (!in_array($row,$tmp)) array_push($tmp,$row); 

print_r ($tmp); 
?> 
+1

Theo [php.net] (http: // php.net/array_push), tốt hơn nên sử dụng '$ tmp [] = $ row' thay vì' array_push ($ tmp, $ row) '. Nếu không, câu trả lời hay. – middus

+0

ah lol, you'r phải, nhưng bây giờ tôi là một nghi ngờ về, tại sao tôi nên sử dụng array_push? : D ahah – Marcx

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