Newbie: Einfachere Art und Weise?

Guten Morgen,

ich muss ein 2D Array, dass so aufgebaut ist:

$MeinArray["A"][$i]
$MeinArray["B"][$i]

untersuchen, ob ["A"][$i] und ["B"][$i] bereits vorkommen. Also ungefähr so:

$Inside = False;
for($i=0;$i<count($MeinArray);$i++) {
   if($MeinArray["A"][$i] == $A and $MeinArray["B"][$i] == $B) {
      $Inside = True;
      break;
   }
}
if($Inside) {
   ...
}

Nur ist das ganze unschön und rechenaufwendig. Kennt ihr da eine bessere Möglichkeit?

  1. 'ǝɯɐu$ ıɥ

    for($i=0;$i<count($MeinArray);$i++) {

    nur mal so am rande: um arrays zu durchlaufen nutzt man foreach, was willst du eigentlich erreichen? feststellen ob ein eintrag schon vorhanden ist? reicht es dann nicht nur nach dem schlüssel oder dem wert zu suchen?

    ssnɹƃ
    ʍopɐɥs

    --
    Answers: $1, Short: $5, Correct: $25, dumb looks are still free ...
    1. was willst du eigentlich erreichen? feststellen ob ein eintrag schon vorhanden ist? reicht es dann nicht nur nach dem schlüssel oder dem wert zu suchen?

      Ja, ich möchte feststellen, ob BEIDE Werte schon vergeben sind. Ein gutes Beispiel wäre z.B. eine Person auf einem Feld, die X und Y Werte besitzt. Hier darf keine Person auf einem Feld stehen, wo schon jemand ist. Das wäre ein vergleichbares Beispiel was ich mit meinen A und B Werten oben erreichen möchte.

      Also soll ich jetzt sowas schreiben wie:

      if(array_search($A,$MeinArray) and array_search($B,$MeinArray)) {
         $Inside = True;
      }

      oder wie? Wäre das nicht wesentlich rechenaufwendiger, da er das ganze Array wieder durchläuft? Ich weiß doch, dass es $MeinArray["A"][$i] ist.

      Kennt noch jemand eine bessere Lösung?

      1. Moin!

        Also soll ich jetzt sowas schreiben wie:

        if(array_search($A,$MeinArray) and array_search($B,$MeinArray)) {
           $Inside = True;
        }

        oder wie? Wäre das nicht wesentlich rechenaufwendiger, da er das ganze Array wieder durchläuft? Ich weiß doch, dass es $MeinArray["A"][$i] ist.

        Nein, du weißt nur, dass in irgendeinem $MeinArray["A"] mit unbekanntem [$i] dein Wert $A gespeichert sein könnte. Das musst du suchen, für B genauso. Und anstelle das selbst mit for oder foreach zu tun, nutzt du lieber eine PHP-Funktion, denn die ist tausendmal schneller als dein eigener Code.

        - Sven Rautenberg

        1. Nein, du weißt nur, dass in irgendeinem $MeinArray["A"] mit unbekanntem [$i] dein Wert $A gespeichert sein könnte. Das musst du suchen, für B genauso. Und anstelle das selbst mit for oder foreach zu tun, nutzt du lieber eine PHP-Funktion, denn die ist tausendmal schneller als dein eigener Code.

          Für B muß er prüfen, ob bei dem Index bei dem $A in $MeinArray["A"] steht $B in $MeinArray["B"] steht. Gibt es dafür eine PHP-Funktion?

        2. Also ich habe das jetzt auf mein Beispiel angepasst:

          elseif(array_search($_POST['A'][$i],$_POST['A'])) {
                $Error .= "Der A-Wert ist schon vergeben!";
              }

          allerdings, funktioniert es nicht. Jedenfalls meint er für jede A-Eingabe immer auszugeben, dass dieser schon vergeben ist, obwohl ich darauf achte, dass sie unterschiedlich sind.

          Kann mir jemand sagen woran das liegt?

          1. Moin!

            Also ich habe das jetzt auf mein Beispiel angepasst:

            elseif(array_search($_POST['A'][$i],$_POST['A'])) {
                  $Error .= "Der A-Wert ist schon vergeben!";
                }

            allerdings, funktioniert es nicht. Jedenfalls meint er für jede A-Eingabe immer auszugeben, dass dieser schon vergeben ist, obwohl ich darauf achte, dass sie unterschiedlich sind.

            Kann mir jemand sagen woran das liegt?

            Zweimal $_POST als Arrayangabe? Klingt falsch.

            - Sven Rautenberg

            1. Zweimal $_POST als Arrayangabe? Klingt falsch.

              Ne, in $_POST['A'] werden doch alle A Eingaben gespeichert. Auf diese greife ich mit $i zu also $_POST['A'][$i]. Nun muss ich bei jedem A (und danach B) gucken, ob es schon vergeben ist, schon in $_POST['A'] enthalten ist.

              1. Ich füge nochmal ein DebugOutput hinzu:

                echo "A WERT: " . $_POST['A'][$i] . "<br>";
                    echo "A ARRAY:";var_dump($_POST['A']);echo "<br>";
                    if(array_search($_POST['A'][$i],$_POST['A'])) {
                      echo "drinnen<br>";
                    }
                    else {
                      echo "draußen<br>";
                    }

                ---

                A WERT: 3
                A ARRAY:array(3) { [0]=> string(1) "3" [1]=> string(1) "1" [2]=> string(1) "2" }
                draußen
                A WERT: 1
                A ARRAY:array(3) { [0]=> string(1) "3" [1]=> string(1) "1" [2]=> string(1) "2" }
                DRINNEN
                A WERT: 2
                A ARRAY:array(3) { [0]=> string(1) "3" [1]=> string(1) "1" [2]=> string(1) "2" }
                DRINNEN

                Wie ihr seht, unterscheiden sich lustigerweise alle Werte. 3 ist angeblich NICHT im array, während die anderen beiden drinnen sind ... Was ist da falsch? Ich muss ja nur rauskriegen, ob sie drinnen sind, um zu verhindern, dass Werte doppelt existieren.

                1. Moin!

                  echo "A WERT: " . $_POST['A'][$i] . "<br>";
                      echo "A ARRAY:";var_dump($_POST['A']);echo "<br>";
                      if(array_search($_POST['A'][$i],$_POST['A'])) {

                  array_search liefert dir entweder den ersten passenden Key zurück, der auf dein Suchelement zutrifft, oder (bool) false.

                  Wenn du in deinem Array nun nach Werten suchst, die du aus diesem Array entnimmst, dann muss array_search immer etwas finden.

                  Und das tut es auch. Es liefert dir, wenn du nach "3" suchst, den zugehörigen Key zurück: Die Zahl 0. Und diese Zahl 0 wird in deiner IF-Abfrage als "false" behandelt, weil du nicht explizit mit dem Äquivalenzoperator === mit false vergleichst, sondern Typecasting erlaubst.

                  Deshalb kriegst du einmal "draußen" als Ausgabe, obwohl dreimal "drinnen" das Resultat wäre.

                  A WERT: 3
                  A ARRAY:array(3) { [0]=> string(1) "3" [1]=> string(1) "1" [2]=> string(1) "2" }
                  draußen

                  Wie ihr seht, unterscheiden sich lustigerweise alle Werte. 3 ist angeblich NICHT im array, während die anderen beiden drinnen sind ... Was ist da falsch? Ich muss ja nur rauskriegen, ob sie drinnen sind, um zu verhindern, dass Werte doppelt existieren.

                  array_search wird dich nicht weiterbringen, wenn es darum geht, Werte, die im Array sind, im Array zu finden - denn das wird immer klappen.

                  Was du willst ist, Werte, die im Array sind, nicht doppelt zu haben. array_unique() macht dir das in deinem Array, danach hast du nichts doppelt mehr.

                  Und wenn du nur wissen willst, ob im Array doppelte Werte sind, dann vergleichst du die Keys, die in den Array sind einmal vor und einmal nach Behandlung durch array_unique(). Die zugehörige Funktion ist array_keys().

                  if (array_keys($_POST["A"]) === array_keys(array_unique($_POST["A"]))) {  
                    //nix doppelt  
                  }  
                  
                  

                  Mit array_keys() könntest du ebenfalls ermitteln, welche Keys existieren zu einem angegebenen Suchwert, und wenn es derer mehr als einen gibt, wäre das "böse". Wäre aber auch wieder eine Schleife, die du durchlaufen müsstest.

                  - Sven Rautenberg

          2. Hi,

            if(array_search($_POST['A'][$i],$_POST['A']))

            Du suchst also im array $_POST['A'], ob darin der Wert $_POST['A'][$i] (also ein Wert aus dem Array) enthalten ist.

            Da Du den zu suchenden Wert aus dem zu durchsuchenden Array nimmst, sollte der sich immer darin befinden.

            Kann es sein, daß Du eigentlich isset() benutzen willst?

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            O o ostern ...
            Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
            1. Nein, ich will testen, ob dieser Wert NOCHMAL vorkommt. KEIN Wert darf 2 mal vorkommen.

              1. Moin!

                Nein, ich will testen, ob dieser Wert NOCHMAL vorkommt. KEIN Wert darf 2 mal vorkommen.

                Du suchst also etwas, was array_unique() machen könnte.

                - Sven Rautenberg