Nur doppelte Einträge aus einem Array zurückgeben (Groß-/Kleinschreibung beachten)

Lesezeit: 5 Minuten

Benutzeravatar von coderex
coderex

Ich möchte alle doppelten Einträge ohne Berücksichtigung der Groß-/Kleinschreibung aus einem Array abrufen. Ist das in PHP möglich?

array(
    1 => '1233',
    2 => '12334',
    3 => 'Hello',
    4 => 'hello',
    5 => 'U'
);

Gewünschtes Ausgabearray:

array(
    1 => 'Hello',
    2 => 'hello'
);

  • Hier gibt es eine ähnliche Frage: stackoverflow.com/questions/1212605/…

    – Bis Theis

    11. August 2009 um 10:26 Uhr

function get_duplicates ($array) {
    return array_unique( array_diff_assoc( $array, array_unique( $array ) ) );
}

  • Ist die erste array_unique wirklich nötig? Ohne es scheint das gleiche Ergebnis zu liefern.

    – luukvhoudt

    8. Juli 2022 um 15:06 Uhr

  • Ich glaube ohne das erste array_unique, wenn das ursprüngliche Array dreimal einen Wert hatte, würde dies ein Array zurückgeben, das ihn zweimal hatte; oder wenn das Original es viermal hatte, würde es die Rückgabe dreimal haben usw.

    – 75. Posaune

    1. Oktober 2022 um 22:08 Uhr

  • Die obigen Kommentare sind der Grund, warum es immer wichtig ist, den Code in Antworten zu erklären.

    – mickmackusa

    12. Dezember 2022 um 21:28 Uhr

Benutzeravatar von Shiva Srikanth Thummidi
Shiva Srikanth Thummidi

<?php
function array_not_unique($raw_array) {
    $dupes = array();
    natcasesort($raw_array);
    reset($raw_array);

    $old_key   = NULL;
    $old_value = NULL;
    foreach ($raw_array as $key => $value) {
        if ($value === NULL) { continue; }
        if (strcasecmp($old_value, $value) === 0) {
            $dupes[$old_key] = $old_value;
            $dupes[$key]     = $value;
        }
        $old_value = $value;
        $old_key   = $key;
    }
    return $dupes;
}

$raw_array    = array();
$raw_array[1] = '[email protected]';
$raw_array[2] = '[email protected]';
$raw_array[3] = '[email protected]';
$raw_array[4] = '[email protected]'; // Duplicate

$common_stuff = array_not_unique($raw_array);
var_dump($common_stuff);

  • Schöne Lösung auch für zweidimensionale Arrays, wenn wir sie verwenden array_map("serialize", $arr); Vor. Vielen Dank!

    – Boolescher_Typ

    5. Mai 2016 um 13:24 Uhr

ryandays Benutzeravatar
Ryanday

Sie müssen die Groß-/Kleinschreibung Ihrer Funktion unempfindlich machen, um das gesuchte Ergebnis “Hello” => “hello” zu erhalten. Versuchen Sie diese Methode:

$arr = array(1=>'1233',2=>'12334',3 =>'Hello' ,4=>'hello', 5=>'U');

// Convert every value to uppercase, and remove duplicate values
$withoutDuplicates = array_unique(array_map("strtoupper", $arr));

// The difference in the original array, and the $withoutDuplicates array
// will be the duplicate values
$duplicates = array_diff($arr, $withoutDuplicates);
print_r($duplicates);

Ausgabe ist:

Array
(
[3] => Hello
[4] => hello
)

Bearbeiten von @AlixAxel:

Diese Antwort ist sehr irreführend. Es funktioniert nur in diesem speziellen Zustand. Dieses Gegenbeispiel:

$arr = array(1=>'1233',2=>'12334',3 =>'Hello' ,4=>'HELLO', 5=>'U');

Scheitert kläglich. Außerdem ist dies nicht der Weg, um Duplikate zu behalten:

array_diff($arr, array_unique($arr));

Da einer der duplizierten Werte in sein wird array_uniqueund dann von abgehackt array_diff.

Bearbeiten von @RyanDay:

Schauen Sie sich also die Antwort von @Srikanth oder @Bucabay an, die für alle Fälle funktionieren (suchen Sie in Bucabay nach Groß- und Kleinschreibung), nicht nur die in der Frage angegebenen Testdaten.

  • Sehr saubere und schöne Art, es zu tun. Fügen Sie einige Kommentare hinzu, damit PHP-Neulinge es verstehen können: Es ist möglich, mit dieser Sprache ordentlichen Code zu schreiben, und es sollte bekannt sein 🙂

    – e-Satis

    11. August 2009 um 10:44 Uhr

  • Übrigens, wenn das Array sehr lang ist, empfehle ich ein Beispiel mit dem Iteratormuster der SPL, um Speicher zu sparen.

    – e-Satis

    11. August 2009 um 10:45 Uhr

  • @rday – Beachten Sie, dass Ihr Testobjekt Zahlen und ein großes “U” enthält, die alle in Großbuchstaben sind, soweit es strtoupper() geht. Die zurückgegebenen Ergebnisse sind die gemischten Groß-/Kleinschreibungswerte, die strtoupper() geändert hat, nicht die Duplikate. Wenn das Poster beide Duplikate benötigt, dann wird die von John vorgeschlagene Lösung die Aufgabe ziemlich effizient mit einer Zeitkomplexität von O (n) erledigen, was meiner Meinung nach hier der beste Fall ist.

    – bucabay

    11. August 2009 um 21:48 Uhr

  • -1, Das ist ein totaler Fehlschlag: codepad.org/7NQ9lQLU. Funktioniert nur durch reinen Zufall.

    – Alix Axel

    20. Oktober 2012 um 16:55 Uhr


  • Ich habe meine 15 Minuten verschwendet, weil ich den Kommentar von @AkshatSinghal gesehen habe

    – mokNathal

    6. Oktober 2015 um 11:18 Uhr

Benutzeravatar von Alix Axel
Alix Axel

Dies ist der richtige Weg (Groß- und Kleinschreibung beachten):

array_intersect($arr, array_unique(array_diff_key($arr, array_unique($arr))));

Und eine Lösung ohne Berücksichtigung der Groß-/Kleinschreibung:

$iArr = array_map('strtolower', $arr);
$iArr = array_intersect($iArr, array_unique(array_diff_key($iArr, array_unique($iArr))));

array_intersect_key($arr, $iArr);

Aber die Antwort von @Srikanth ist effizienter (eigentlich ist es die einzige, die funktioniert richtig außer diesem).

Benutzeravatar von bucabay
bucabay

function array_not_unique($raw_array) {
    $dupes = array();
    natcasesort($raw_array);
    reset($raw_array);

    $old_key   = NULL;
    $old_value = NULL;
    foreach ($raw_array as $key => $value) {
        if ($value === NULL) { continue; }
        if (strcasecmp($old_value, $value) === 0) {
            $dupes[$old_key] = $old_value;
            $dupes[$key]     = $value;
        }
        $old_value = $value;
        $old_key   = $key;
    } return $dupes;
}

Was Srikanth (John) hinzufügt, aber mit dem Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung.

Versuchen:

$arr2 = array_diff_key($arr, array_unique($arr));

Groß-/Kleinschreibung egal:

array_diff_key($arr, array_unique(array_map('strtolower', $arr)));

Benutzeravatar von Bossman
Boss

12 Jahre alter Beitrag und die akzeptierte Antwort gibt ein leeres Array zurück und andere sind lang.

Hier ist meine Einstellung für zukünftige Googler, die kurz ist und ALLE doppelten Indizes (Indizes?) Zurückgibt.

$myArray = array('fantastic', 'brilliant', 'happy', 'fantastic', 'Happy', 'wow', 'battlefield2042 :(');

function findAllDuplicates(array $array)
{
    // Remove this line if you do not need case sensitive.
    $array = array_map('strtolower', $array);

    // Remove ALL duplicates
    $removedDuplicates = array_diff($array, array_diff_assoc($array, array_unique($array)));

    return array_keys(array_diff($array, $removedDuplicates));
    // Output all keys with duplicates
    // array(4) {
    //   [0]=>int(0)
    //   [1]=>int(2)
    //   [2]=>int(3)
    //   [3]=>int(4)
    // }


    return array_diff($array, $removedDuplicates);
    // Output all duplicates
    // array(4) {
    //   [0]=>string(9) "fantastic"
    //   [2]=>string(5) "happy"
    //   [3]=>string(9) "fantastic"
    //   [4]=>string(5) "happy"
    // }
}

1440810cookie-checkNur doppelte Einträge aus einem Array zurückgeben (Groß-/Kleinschreibung beachten)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy