PHP 배열에서 중복 값을 감지하는 방법은 무엇입니까?


115

PHP에서 1 차원 배열로 작업하고 있습니다. 중복 값의 존재를 감지하고 중복 값의 수를 세고 결과를 출력하고 싶습니다. 예를 들어 다음과 같은 배열이 있습니다.

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

인쇄하고 싶습니다 :

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

이 문제에 접근하는 방법에 대한 조언이 있습니까?

감사.

마이크

답변:


239

array_count_values 함수를 사용할 수 있습니다.

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

print_r(array_count_values($array));

출력됩니다

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

1
이 솔루션은 정수 및 문자열이 아닌 값을 다루지 않으며 결론적으로 부작용을 생성합니다.
codekandis

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

"... 그런 다음 중복 값의 수를 세고 결과를 출력하십시오."
showdev

이 솔루션은 정수 및 문자열이 아닌 값을 다루지 않으며 결론적으로 부작용을 생성합니다. 사용하면 array_unique($array, SORT_REGULAR)PHP가 유형을 변경하지 않고 정상적으로 요소를 확인하지만 느슨한 비교입니다. 따라서 동일한 콘텐츠를 가진 한 클래스의 다른 인스턴스는 고유하게됩니다.
codekandis

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

1
이것은 중복 값만 반환하는 유일한 대답입니다.
Redzarf

1
중복 값 목록 만 제공하도록 확장 (내가 필요로하는 것) :return array_values(array_unique(array_diff_key($a, array_unique($a))));
Autumn Leonard

9

과일을 키로 사용하고 발생 횟수를 값으로 사용하여 해당 배열을 연관 배열로 전환 할 수 있습니다. 약간 장황하지만 다음과 같이 보입니다.

$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
좋은 대답은하지만, PHP는 것을 않는 기존의 기능을 가지고있다 : array_count_values
Navarr

9

제거하려면 array_unique(). 사용 여부를 감지 count(array_unique())하고 count($array).


2

에 물건을 map(의사)

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

    $m[$word] += 1;
}

2

아마도 이와 같은 것입니까 (예상되지 않은 코드이지만 아이디어를 제공해야 함)?

$new = array();

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

그런 다음 값을 키로 사용하는 새 배열을 얻고 해당 값은 원래 배열에 존재 한 횟수입니다.


좋은 대답은하지만, PHP는 것을 않는 기존의 기능을 가지고있다 : 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

제가 찾고있는 답을 찾지 못해서이 함수를 작성했습니다. 이것은 두 배열 사이의 중복 만 포함하는 배열을 만들지 만 요소가 중복 된 횟수를 인쇄하지 않으므로 질문에 직접 대답하지는 않지만 내 상황에있는 누군가에게 도움이되기를 바랍니다.

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

출력 :

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

0

간단한 방법 :

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

이것은 고유하지 않은 값을 계산하지 않고 필터링 만합니다.
m02ph3u5
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.