susi: auf doppelte Inhalte im Array prüfen

Hallo,
wie gut findet ihr meinen Ansatz in einem Array auf doppelte Einträge zu prüfen:

Array $cells enthält Feld-ID's unbekannter Anzahl einer Datenbankform. Stets nur "alphanumeric" (Überprüfung an anderer Stelle). Ausgeschlossen werden sollen doppelte Feld-ID's wegen Konflikten bei POST und co.

  
//Konsistenzkontrolle: doppelte Schlüssel  
$keycounts  = array_count_values($cells);  
foreach($keycounts as $keycount) if ($keycount > 1) $DBinfo = "double_key";  

An anderer Stelle prüfe ich $DBinfo auf Inhalt: wenn ungleich "db_ok" gibt es entsprechende Fehlermeldungen aus.

Gibt es etwas noch eleganteres? Wie macht ihr das? Funktion übersehen?

Grüße

  1. Hi!

    Gibt es etwas noch eleganteres? Wie macht ihr das? Funktion übersehen?

    count(array_unique($cells)) == count($cells)

    Lo!

    1. Moin!

      count(array_unique($cells)) == count($cells)

      Oder so...

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix

    2. Danke an Euch beide.

      Ein Frage noch:

      Wobei ich mich sehr ernsthaft frage warum Du nicht schon in der Datenbank einen unique-Index benutzt. Dann kann das nämlich gar nicht vorkommen.

      was heisst das?

      1. Moin!

        was heisst das?

        Gegenfrage: Was heisst:

        Array $cells  enthält Feld-ID's unbekannter Anzahl einer Datenbankform.

        Dem habe ich entnommen, dass die Daten aus einer Datenbank stammen.

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix

        1. Gegenfrage: Was heisst:

          Array $cells  enthält Feld-ID's unbekannter Anzahl einer Datenbankform.

          zum Beispiel: ("id", "name", "description", "altname", "picture", "na1", "na2", "na3", "na4")

          Das sind Feldnamen, ich nenne sie mal Feld-ID's! Irgendwann hat sie sich mal einer Ausgedacht, als er eine neue Datenbank angelegt hat. Früher waren mehrere Felder "na" erlaubt. Das führte zu Problemen, so dass ich jetzt "na1", "na2" verwende.

          Dem habe ich entnommen, dass die Daten aus einer Datenbank stammen.

          Das ist die Datenbankdefinition. Die Daten stehen woanders... Werden an anderer Stelle gelesen/geschrieben.

          Was meinst Du? Könnte man das anders machen?

          1. Moin!

            Du hast also ein Formular in dem jemand Spaltennamen für eine Datenbanktabelle vergibt, welche erst noch angelegt wird?

            Früher waren mehrere Felder "na" erlaubt.

            Lass mich raten: Früher waren diese "Feldnamen" ein "Kommentar" in der ersten Zeile einer CSV-Datei oder einer anderen primitiven Serialisierungslösung.

            Die Daten stehen woanders... Werden an anderer Stelle gelesen/geschrieben.

            Hübsch. Du sollst also Fehler Dritter abfangen? Dann gehe so vor als seien dies Benutzereingaben oder, falls mehrere am gleichen Projekt programmieren oder Konfigurationsdateien anlegen, regele die Zuständigkeiten und die ordnungsgemäße Dokumentation. Dass die Spalten unterschiedliche Namen haben müsse gehört dann dem Kollegen auf die Nase gedrückt weil es schlicht Unsinn ist einen ganzen Haufen Rechenleistung darauf zu verschwenden Fehler eines Mittäters auszubügeln.

            Wenn es Benutzereingaben sind, dann geht es nicht anders.

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix

  2. Moin!

    Du kannst array_flip benutzen.

    if ( count($ar) > count(array_flip($ar)) ) {  
         $DBinfo = "double_key";  
    }
    

    Wobei ich mich sehr ernsthaft frage warum Du nicht schon in der Datenbank einen unique-Index benutzt. Dann kann das nämlich gar nicht vorkommen.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

    1. Hi!

      Du kannst array_flip benutzen.

      Es ist meist ungünstig, ein Mittel zu nehmen, mit dem man zwar das Ziel erreicht, das Mittel aber für etwas ganz anderes vorgesehen ist. Im Falle von array_flip() baust du auf die Nebenwirkung, dass, weil es keine zwei Array-Elemente mit dem selben Key geben kann, gleiche Inhalte zu einem Eintrag reduziert werden. Wenn man das array_flip() vor sich hat, muss man erst einmal darauf kommen, dass genau das Verhalten genutzt werden soll, die Hauptaufgabe des Key-Value-Austauschs jedoch völlig uninteressant ist. Im ungünstigsten Fall missversteht man das Anliegen des Konstrukts, wenn es nicht kommentiert wurde.

      Wobei ich mich sehr ernsthaft frage warum Du nicht schon in der Datenbank einen unique-Index benutzt. Dann kann das nämlich gar nicht vorkommen.

      Es sieht eher danach aus, als ob es nicht um Inhalte sondern um Feldnamen geht. Nur wenn diese Feldnamen ihrerseits Inhalt einer weiteren Tabelle sind, ist ein Index anwendbar.

      Lo!

      1. Moin!

        Du kannst array_flip benutzen.

        Es ist meist ungünstig, ein Mittel zu nehmen, mit dem man zwar das Ziel erreicht, das Mittel aber für etwas ganz anderes vorgesehen ist.

        Ja. Auch ich hatte array_unique() übersehen. Asche auf mein Haupt!

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix