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 2018年

このソリューションは、整数および文字列以外の値をカバーしておらず、結論として、副次的な影響をもたらします。array_unique($array, SORT_REGULAR)PHPを使用すると、タイプを変更せずに通常どおり要素をチェックしますが、これは大まかな比較です。したがって、同じコンテンツを持つ1つのクラスの異なるインスタンスは一意化されます。
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

探していた答えが見つからなかったので、この関数を書きました。これにより、2つの配列間の重複のみを含む配列が作成されますが、要素が重複した回数は出力されません。そのため、質問に直接答えることはできませんが、私の状況の誰かを助けることを期待しています。

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.