Array auf doppelte Einträge prüfen

  • Hallo zusammen! :)

    Hab ne kleine Frage zu Arrays.
    Und zwar möcht Zahlen aus einem Form prüfen ob sie doppelt oder mehrfach eingegeben wurden und eine Fehlermeldung ausgeben wenn das der Fall ist.

    PHP
    <form action="index.php" method="post">
    <input type="text" name="zahl1" size="1" maxlength="2" value="<?php echo $_POST['zahl1']; ?>">
    <input type="text" name="zahl2" size="1" maxlength="2" value="<?php echo $_POST['zahl2']; ?>">
    <input type="text" name="zahl3" size="1" maxlength="2" value="<?php echo $_POST['zahl3']; ?>">
    <input type="text" name="zahl4" size="1" maxlength="2" value="<?php echo $_POST['zahl4']; ?>">
    <input type="text" name="zahl5" size="1" maxlength="2" value="<?php echo $_POST['zahl5']; ?>">
    <input type="text" name="zahl6" size="1" maxlength="2" value="<?php echo $_POST['zahl6']; ?>"><br>
    <input type="submit" name="submit" value="Auswerten">
    </form>




    Hab mir gedacht das geht am Besten mit einem Array:

    PHP
    $checkarray = array(
    'zahl1' => $_POST['zahl1'],
    'zahl2' => $_POST['zahl2'],
    'zahl3' => $_POST['zahl3'],
    'zahl4' => $_POST['zahl4'],
    'zahl5' => $_POST['zahl5']);



    aber jetzt weiss ich nichtmehr weiter.
    array_key_exists prüft ja nicht ob da was doppelt ist... oder doch?

    Hat einer ne Idee?

  • Ahhhh, sorry, nicht aufmerksam gelesen.
    Also dann würde ich das ganz spontan so lösen:

    PHP
    <php
    foreach ($checkarray as $element) {
     $equals = 0;
     foreach ($checkarray as $compare) {
      if ($element == $compare) $equals++;
     }
     if ($equals > 1) echo "Fehler: ".$element." ist ".$equals." mal vorhanden!<br />";
    }

    Ungetestet... aber versuchs mal.

    EDIT: Ok, passt noch nicht ganz, so bekommt man den Fehler genau so oft angezeigt, wie der Eintrag vorhanden ist der nicht "unique" ist.


    Ausgabe:

    Zitat

    Fehler: value0 ist 2 mal vorhanden!
    Fehler: value3 ist 3 mal vorhanden!

    3 Mal editiert, zuletzt von FaFoo (30. Januar 2009 um 10:19)

  • Das ganze ist schon taktisch unglücklich aufgebaut. Besser wäre in dem Fall ein Array:

    <input type="text" name="zahl[]" ....>

  • Vielen Dank, FaFoo!

    Genau das was ich gebraucht hab ;)



    Gruß, Donkey

  • Schön, dass du meinen Hinweis ignorierst und schön, dass du die Doku nicht richtig gelesen hast. Die Überprüfung und Ausgabe, welche Zahlen doppelt eingegeben wurden, ist ein Zweizeiler, wenn man array_count_values benutzt.

  • Hallo Bandit!

    Sorry hab Deine Nachricht wohl nich gesehen.

    Dein Vorschlag is natürlich auch eine Möglichkeit.
    Aber bei einem Zweizeiler wirds trotzdem nicht bleiben, weil dieses Array ja auch erstmal ausgelesen werden und ne verständliche Fehlermeldung draus gemacht werden muss.

    Wenn ich dem User was mit print_r hinknall können vermutlich die Wenigsten was damit anfangen :D

  • Aber bei einem Zweizeiler wirds trotzdem nicht bleiben



    Stimmt, wenn du die Felder als Array übergeben lässt, ist das kein Zweizeiler, sondern ein Dreizeiler:

    PHP
    <?php
       $data = array_count_values($_POST['zahl']);
    
       foreach ($data as $key => $value)
         if ($value > 1) echo "$key kommt $value mal vor<br>\n";
    ?>
  • Viele Wege... und Rom und so...
    Aber array_count_values ist mir auch vorher noch nicht bekannt gewesen aber gut zu wissen.
    Aber vielleicht will man die Werte ja nocht genauer untersuchen und vergleichen. Naja, muss man dann selber wissen.

    Aber dieses erstellen von Arrays durch Formularfelder ist natürlich auch manchmal ganz praktisch :>