2010-10-14 52 views

Trả lời

12

Bạn có thể sử dụng một sự kết hợp của array_unique, array_diff_assocarray_diff:

array_diff($arr, array_diff_assoc($arr, array_unique($arr))) 
+2

Thật là một giải pháp kỳ lạ đơn giản. –

+1

Lưu ý rằng mặc dù đây có thể là một giải pháp ngắn gọn, tất cả các hàm đang sử dụng Quicksort nội bộ trong trường hợp xấu nhất (O (n · log n) trong trường hợp trung bình). Vì vậy, tổng số phức tạp là trong O (n²) trong trường hợp xấu nhất quá. – Gumbo

4

Bạn có thể sử dụng

$singleOccurences = array_keys(
    array_filter(
     array_count_values(
      array('banana', 'mango', 'banana', 'mango', 'apple') 
     ), 
     function($val) { 
      return $val === 1; 
     } 
    ) 
) 

Xem

  • array_count_values - Đếm tất cả các giá trị của một mảng
  • array_filter - Bộ lọc các yếu tố của một mảng sử dụng một hàm callback
  • array_keys - Return tất cả các phím hoặc một nhóm nhỏ trong những chìa khóa của một mảng
  • callbacks
+0

bây giờ có ý nghĩa, vẫn còn, tôi thích tôi hơn ^^ – Hannes

+2

@ Hannes Tôi không - điều này là thanh lịch :) – jensgram

-1

PHP.net http://php.net/manual/en/function.array-unique.php

array array_unique (array $array [, int $sort_flags = SORT_STRING ])

Lấy một mảng đầu vào và trả về một mảng mới không có giá trị trùng lặp.


giải pháp mới:


function remove_dupes(array $array){ 
    $ret_array = array(); 
    foreach($array as $key => $val){ 
     if(count(array_keys($val) > 1){ 
      continue; 
     } else { 
      $ret_array[$key] = $val; 
     } 
} 
+1

-1 đọc ví dụ trong câu hỏi; 'array_unique' không hoạt động. – meagar

+1

Loại bỏ các bản sao, do đó làm cho mảng chứa các giá trị duy nhất. OP, tuy nhiên, muốn * tất cả * trường hợp của bất kỳ giá trị trùng lặp nào bị xóa, tức là chỉ giữ lại các giá trị được biểu diễn * chính xác * một lần. – jensgram

+0

Tôi không hiểu ý bạn là gì. nó sẽ hoạt động. EDIT: oh, như thế. –

1

Nếu bạn chỉ muốn rời khỏi các giá trị trong mảng mà đã độc đáo, thay vì chọn một đối tượng duy nhất của mỗi giá trị, bạn sẽ thực sự phải cuộn của riêng bạn. Chức năng tích hợp sẵn chỉ có để khử trùng các bộ giá trị, chứ không phải là bộ lọc.

1

Bạn muốn xóa mọi mục nhập trùng lặp, để bạn chỉ còn lại các mục nhập duy nhất trong danh sách? Hmm nó có vẻ giống như một cái gì đó bạn sẽ cần phải cuộn của riêng bạn.

1

Không có chức năng hiện có; Bạn sẽ phải làm điều này trong hai đèo, một để đếm các giá trị độc đáo và một để trích xuất các giá trị duy nhất:

$count = array(); 
foreach ($values as $value) { 
    if (array_key_exists($value, $count)) 
    ++$count[$value]; 
    else 
    $count[$value] = 1; 
} 

$unique = array(); 
foreach ($count as $value => $count) { 
    if ($count == 1) 
    $unique[] = $value; 
} 
2

Chỉ cần viết riêng vòng lặp đơn giản foreach của bạn:

$used = array();  
$array = array("banna","banna","mango","mango","apple"); 

foreach($array as $arrayKey => $arrayValue){ 
    if(isset($used[$arrayValue])){ 
     unset($array[$used[$arrayValue]]); 
     unset($array[$arrayKey]); 
    } 
    $used[$arrayValue] = $arrayKey; 
} 
var_dump($array); // array(1) { [4]=> string(5) "apple" } 

vui chơi:)

+1

Vì lý do nào đó, tôi không nghĩ rằng bạn có thể thay đổi kích thước của một mảng theo cách đó trong một 'foreach', nhưng có vẻ như nó hoạt động. – meagar

+0

Có lý do nào bạn không khai báo '$ used = array()' trước vòng lặp 'foreach' không? –

+1

@Kendall Hopkins nó không phải là cần thiết, nhưng bạn đúng theo tinh thần của các tiêu chuẩn mã hóa tốt tôi sẽ thêm nó :) – Hannes

0

Câu trả lời ở trên trông rất tuyệt, nhưng trên một mặt lưu ý: nếu bạn muốn loại bỏ các bản sao nhưng hãy để cái đầu tiên, sử dụng array_flip hai lần sẽ là một cách khá đơn giản để làm như vậy.array_flip (array_flip (x))

+0

bạn đã có 'mảng_unique' cho điều đó –

0

Chỉ một phần liên quan đến câu hỏi cụ thể này - nhưng tôi tạo ra chức năng này từ câu trả lời Gumbo cho mảng đa chiều: trạng thái

function get_default($array) 
{ 
    $default = array_column($array, 'default', 'id'); 
    $array = array_diff($default, array_diff_assoc($default, array_unique($default))); 

    return key($array); 
} 

Trong ví dụ này, tôi đã lưu trữ và mỗi người khác với mặc định là 0 (mặc định là 1). Tôi lập chỉ mục mảng default từ các ID, sau đó biến nó thành một chuỗi. Vì vậy, để được rõ ràng - kết quả trả về của điều này là ID của tình trạng mặc định cung cấp nó trong cùng một phần của mảng đa chiều và không phải là chìa khóa của nó

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