Làm thế nào để phát hiện các giá trị trùng lặp trong mảng PHP?


115

Tôi đang làm việc với mảng một chiều trong PHP. Tôi muốn phát hiện sự hiện diện của các giá trị trùng lặp, sau đó đếm số lượng các giá trị trùng lặp và đưa ra kết quả. Ví dụ, cho mảng sau:

$array = array('apple', 'orange', 'pear', 'banana', 'apple',
   'pear', 'kiwi', 'kiwi', 'kiwi');

Tôi muốn in:

apple (2)
orange
pear (2)
banana
kiwi (3)

Bất kỳ lời khuyên về cách tiếp cận vấn đề này?

Cảm ơn.

Mike

Câu trả lời:


239

Bạn có thể sử dụng hàm array_count_values

$array = array('apple', 'orange', 'pear', 'banana', 'apple',
'pear', 'kiwi', 'kiwi', 'kiwi');

print_r(array_count_values($array));

sẽ xuất ra

Array
(
   [apple] => 2
   [orange] => 1
   [pear] => 2
   etc...
)

1
Giải pháp này không bao gồm bất kỳ giá trị không phải là số nguyên và không phải là chuỗi và kết luận là nó tạo ra tác dụng phụ.
codekandis

110
if(count(array_unique($array))<count($array))
{
    // Array has duplicates
}
else
{
    // Array does not have duplicates
}

"... sau đó đếm số giá trị trùng lặp và đưa ra kết quả."
showdev

Giải pháp này không bao gồm bất kỳ giá trị không phải là số nguyên và không phải là chuỗi và kết luận là nó tạo ra tác dụng phụ. Việc sử dụng array_unique($array, SORT_REGULAR)buộc PHP kiểm tra các phần tử một cách bình thường mà không cần thay đổi kiểu, nhưng đó là một phép so sánh lỏng lẻo. Vì vậy, các trường hợp khác nhau của một lớp có cùng nội dung sẽ được thống nhất.
codekandis

38
function array_not_unique( $a = array() )
{
  return array_diff_key( $a , array_unique( $a ) );
}

1
Đây là câu trả lời duy nhất chỉ trả về các giá trị trùng lặp.
Redzarf

1
Mở rộng để chỉ cung cấp danh sách các giá trị trùng lặp (những gì tôi cần):return array_values(array_unique(array_diff_key($a, array_unique($a))));
Autumn Leonard

9

Bạn có thể thử biến mảng đó thành một mảng kết hợp với các kết quả là khóa và số lần xuất hiện dưới dạng giá trị. Hơi dài dòng, nhưng có vẻ như:

$array = array('apple', 'orange', 'pear', 'banana', 'apple',
   'pear', 'kiwi', 'kiwi', 'kiwi');
$new_array = array();
foreach ($array as $key => $value) {
    if(isset($new_array[$value]))
        $new_array[$value] += 1;
    else
        $new_array[$value] = 1;
}
foreach ($new_array as $fruit => $n) {
    echo $fruit;
    if($n > 1)
        echo "($n)";
    echo "<br />";
}

1
Câu trả lời tốt, nhưng PHP có một chức năng hiện có mà không chỉ rằng: array_count_values
Navarr

9

Để thoát khỏi việc sử dụng array_unique(). Để phát hiện nếu có bất kỳ sử dụng count(array_unique())và so sánh với count($array).


2

Nhét chúng vào một map(mã giả)

map[string -> int] $m
foreach($word in $array)
{
    if(!$m.contains($word))
        $m[$word] = 0;

    $m[$word] += 1;
}

2

Có lẽ một cái gì đó như thế này (mã chưa được kiểm tra nhưng sẽ cung cấp cho bạn một ý tưởng)?

$new = array();

foreach ($array as $value)
{
    if (isset($new[$value]))
        $new[$value]++;
    else
        $new[$value] = 1;
}

Sau đó, bạn sẽ nhận được một mảng mới với các giá trị là khóa và giá trị của chúng là số lần chúng tồn tại trong mảng ban đầu.


Câu trả lời tốt, nhưng PHP có một chức năng hiện có mà không chỉ rằng: array_count_values
Navarr

0
$count = 0;
$output ='';
$ischeckedvalueArray = array();
for ($i=0; $i < sizeof($array); $i++) {
    $eachArrayValue = $array[$i];
    if(! in_array($eachArrayValue, $ischeckedvalueArray)) {
        for( $j=$i; $j < sizeof($array); $j++) {
            if ($array[$j] === $eachArrayValue) {
                $count++;
            }
        }
        $ischeckedvalueArray[] = $eachArrayValue;
        $output .= $eachArrayValue. " Repated ". $count."<br/>";
        $count = 0;
    }

}

echo $output;

0

Tôi không tìm thấy câu trả lời mà tôi đang tìm kiếm, vì vậy tôi đã viết hàm này. Điều này sẽ tạo ra một mảng chỉ chứa các phần tử trùng lặp giữa hai mảng, nhưng không in số lần một phần tử được sao chép, vì vậy nó không trả lời trực tiếp câu hỏi, nhưng tôi hy vọng nó sẽ giúp ai đó trong trường hợp của tôi.

function findDuplicates($array1,$array2)
{
    $combined = array_merge($array1,$array2);
    $counted = array_count_values($combined);
    $dupes = [];
    $keys = array_keys($counted);
    foreach ($keys as $key)
    {   
        if ($counted[$key] > 1)
        {$dupes[] = $key;}
    }
    sort($dupes);
    return $dupes;
}
$array1 = [1,2,3,4,5];
$array2 = [4,5,6,7,8];
$dupes = findDuplicates($array1,$array2);
print_r($dupes);

Kết quả đầu ra:

Array
(
    [0] => 4
    [1] => 5
)

0

Một phương pháp đơn giản:

$array = array_values(array_unique($array, SORT_REGULAR));

Điều này không tính các giá trị không phải duy nhất mà chỉ lọc chúng.
m02ph3u5
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.