Xannasavin: 2 (verschiedene?) Arrays vergleichen

Hallo zusammen!

Ich hab schon ein paar Themen hier und im Netz zu dem Thema gefunden, allerdings schien mir nichts auf meinen "Fall" zuzutreffen...

Also:

Array 1 hole ich mir aus der DB, es wird in der Form

1 28 15 17

abgespeichert...

==> $users = explode(' ',$row['users']);

danach hole ich mir über

  
$array2 = $db->query_first("SELECT playerid FROM bb".$n."_sessions WHERE  sessionid= '$sessionid' AND status = '1'");  
$array3 = $db->query_first("SELECT playerid FROM bb".$n."_sessions WHERE  sessionid= '$sessionid' AND status = '2'"); 	  
$array4 = $db->query_first("SELECT playerid FROM bb".$n."_sessions WHERE  sessionid= '$sessionid' AND status = '3'");  

Die Userid's der User aus der Datenbank, die sich eingetragen haben.

Um das ganze zu vereinfachen dachte ich mir die Arrays zusammenzufügen

$merged_arrays = array_merge($array2, $array3, $array4);

So, und jetzt kommt mein Problem:

Ich möchte die Werte aus $users (Das ist die komplette Gruppe) mit den Werten aus $merged_arrays vergleichen und mir dann ausgeben lassen, welche Userid's noch fehlen, am besten wieder als array, damit ich noch die Usernamen dazu auslesen lassen kann...

mit array_diff() bin ich leider nicht weiter gekommen und so wie ich das mit den if schleifen und dem zähler verstanden habe, vergleicht der ja immer nur die selben zeilen miteinander...

  1. $array2 = $db->query_first("SELECT playerid FROM bb".$n."_sessions WHERE  sessionid= '$sessionid' AND status = '1'");
    $array3 = $db->query_first("SELECT playerid FROM bb".$n."_sessions WHERE  sessionid= '$sessionid' AND status = '2'");
    $array4 = $db->query_first("SELECT playerid FROM bb".$n."_sessions WHERE  sessionid= '$sessionid' AND status = '3'");

      
    
    > So, und jetzt kommt mein Problem:  
      
    IMHO ist dein Problem, dass du 3 Abfragen machst, wo eine reicht - den ODER-Operator in SQL kennst du?
    
    1. Stimmt, im Prinzip kann ich mir das mit dem Status auch sparen, weil es ja nur status 1, 2 und 3 gibt...
      da hast du recht, das ist unnötig umständlich ^^

      okay, ich habs mir gespart, nur irgendwie funktioniert das ganze trotzdem nicht richtig...

      wenn die 2. abfrage (array2) leer ist, liefert mir

      $unterschied = array_diff($array, $array2);

      nichts. sollte es dann nicht alle werte aus $array ausspucken, da diese in $array2 nicht vorkommen?

      bei den abfragen in denen userid's übergeben werdem, wird beim vergleich nur die erste userid die in $array2 vorkommt aus $array nicht ausgespuckt...

      hmm bin ich konfus oder nehm ich die falschen befehle?

      1. hmm bin ich konfus oder nehm ich die falschen befehle?

        Ich hab' kein Wort verstanden.

        1. also gut, ich probiers nochmal ;)

          Array 1 hole ich mir aus der DB, es wird in der Form

          1 28 15 17

          abgespeichert...

          ==> $users = explode(' ',$row['users']);

          das 2. array bekomme ich durch

          $array2 = $db->query_first("SELECT playerid FROM bb".$n."_sessions WHERE sessionid= '$sessionid'");

          Beispiel:

          $array1 = d b a c e

          $array2 = c b

          $unterschied = array_diff($array, $array2);

          liefert mir allerdings

          $unterschied = d a c e

          Es wird nur 1 Wert "abgezogen" (b), dass "c" im 2. array vorhanden ist wird irgendwie ignoriert.

          Gibt es noch eine andere Möglichkeit die 2 Arrays zu vergleichen?
          Ich frage ja danach die Usernamen zu den Userid's ab. Funktioniert

          $usernames = $db->query_first("SELECT username FROM bb".$n."_users WHERE userid IN '$array1' AND userid NOT IN 'array2'");

          ?

          1. Hi,

            $array1 = d b a c e

            $array2 = c b

            $unterschied = array_diff($array, $array2);

            Wenn ich aus diesen Pseudo-Arrays mal "richtige" mache, und damit teste -

            liefert mir allerdings

            $unterschied = d a c e

            dann erhalte ich ein Array mit d, a, e als Elementen.

            Hast du denn den folgenden Hinweis aus dem Manual bzgl. array_diff berücksichtigt?

            Note: Two elements are considered equal if and only if (string) $elem1 === (string) $elem2. In words: when the string representation is the same.

            MfG ChrisB

            --
            Light travels faster than sound - that's why most people appear bright until you hear them speak.
            1. Wenn ich aus diesen Pseudo-Arrays mal "richtige" mache

              sollte nur ein Beispiel sein ><

              Hast du denn den folgenden Hinweis aus dem Manual bzgl. array_diff berücksichtigt?
              »» Note: Two elements are considered equal if and only if (string) $elem1 === (string) $elem2. In words: when the string representation is the same.

              Nya, da liegt der Hund ja glaube ich begraben. Die Arrays enthalten zwar beide nur Zahlen, kommen aber auf unterschiedliche Art zustande... Deswegen habe ich auch die Überschrift "verschiedene?" gewählt...

              Ich hab grad keine Idee mehr, wie ich die "fehlenden" Userid's, also den Unterschied, zwischen den 2 arrays rausbekomme =(

  2. Hallo nochmal zusammen!

    Ich versuch das jetzt nochmal auf die Basis runterzubrechen, vllt wird deutlicher wo mein Problem liegt, auf jedenfall wirds denke ich übersichtlicher...

    Wert 1 bekomme ich aus einer DB Abfrage:

    $result = $db->query("SELECT groupplayers FROM bb".$n."_ws_groups WHERE groupid = '$ws_groupid'");  
    //$result['groupplayers ']liefert "1 3 2 14 15" ohne die Anführungszeichen 
    

    Wert 2 kommt aus einer 2. DB Abfrage:

    $result2 = $db->query_first("SELECT playerid FROM bb".$n."_ws_sessions_player WHERE groupid = '$ws_groupid' AND wssessionid = '$ws_sessionid'");

    Wert 2 ist ein Array.

    Ich möchte nun Überprüfen, ob die Zahlen aus Wert 1 ($result) in Wert 2 ($result2) vorkommen. Wenn dem nicht so ist, möchte ich für jeden Wert, der nur in $result vorkommt, in einer 3. Abfrage die zugehörigen Namen auslesen und ausgeben lassen.

    Ich habe versucht das irgendwie zu lösen indem ich versucht habe Wert 1 in ein array zu wandeln, aber mit wenig erfolg wie zu sehen ist - vllt habe ich ja einen Fehler gemacht...

    Grüße

    1. echo $begrüßung;

      Wert 1 bekomme ich aus einer DB Abfrage:
      $result = $db->query("SELECT groupplayers FROM bb".$n."_ws_groups WHERE groupid = '$ws_groupid'");
      //$result['groupplayers ']liefert "1 3 2 14 15" ohne die Anführungszeichen

      Mach doch mal Kontrollausgaben mit var_dump(). Daran kann man genauer sehen was Phase ist als mit deinen Umschreibungen. Und wenn du mit dem Ergebnis ein Problem hast, dann nützt auch das SQL-Statement nichts. Man kann das Problem damit nicht nachvollziehen, weil dazu das Tabellenlayout und die Daten fehlen und keiner weiß, was das Objekt $db konkret darstellt, geschweige denn, was die Methode query() so alles anstellt.

      Ich nehme an, du bekommst einen String mit Leerzeichen getrennten Zahlen und gemäß deinem Ausgangsposting hantierst du auch mit explode() rum. Hast du geprüft (Kontrollausgabe!), dass das alles das ergibt, was du dir vorgestellt hast?

      Wert 2 kommt aus einer 2. DB Abfrage:

      $result2 = $db->query_first("SELECT playerid FROM bb".$n."_ws_sessions_player WHERE groupid = '$ws_groupid' AND wssessionid = '$ws_sessionid'");
      Wert 2 ist ein Array.

      Auch hier ist nicht ersichtlich, wie aus obigem Code ein Array entsteht. Und eigentlich ist das ja auch uninteressant. Wichtig ist nur, dass du dich überzeugt hast, dass Wert 2 auch das ist, was du annimmst.

      Ich möchte nun Überprüfen, ob die Zahlen aus Wert 1 ($result) in Wert 2 ($result2) vorkommen. Wenn dem nicht so ist, möchte ich für jeden Wert, der nur in $result vorkommt, in einer 3. Abfrage die zugehörigen Namen auslesen und ausgeben lassen.

      Mit einem ordentlich Datenlayout könntest du diese Abfrage gleich im DBMS machen. Mehrere Werte mit Trennzeichen dazwischen in einer Tabellenzelle ist ein ungeeignetes Format, so dass du mit deutlich höherem Aufwand rumhantieren musst.

      Ich habe versucht das irgendwie zu lösen indem ich versucht habe Wert 1 in ein array zu wandeln, aber mit wenig erfolg wie zu sehen ist - vllt habe ich ja einen Fehler gemacht...

      Sicherlich, nur kann ihn keiner nachvollziehen, wenn du keine nachvollziehbare Beschreibung abgibst. Also gib bitte eine Kontrollausgabe der beiden Werte sowie den Code an, mit dem du die Werte für die dritte Abfrage erstellst.

      echo "$verabschiedung $name";