จะตรวจหาค่าที่ซ้ำกันในอาร์เรย์ PHP ได้อย่างไร?


115

ฉันกำลังทำงานกับอาร์เรย์หนึ่งมิติใน PHP ฉันต้องการตรวจจับการมีอยู่ของค่าที่ซ้ำกันจากนั้นนับจำนวนค่าที่ซ้ำกันและนำผลลัพธ์ออกมา ตัวอย่างเช่นกำหนดอาร์เรย์ต่อไปนี้:

$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

อาจจะเป็นแบบนี้ (รหัสที่ยังไม่ทดลอง แต่ควรให้ความคิดกับคุณ)?

$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.