shinkou: Doppelt vorkommende Werte innerhalb einer Variable entfernen

Hi Leute!

Ich bitte euch um evtl. Denkanstöße, da ich nach einem ganzen Tag proggen etwas ideenlos bin...

Meine Variable $ids hat z.B. folgenden Inhalt ",31,43,32,31,31,".
Ich möchte nun den Inhalt durchsuchen, und evtl. doppelt vorkommende Nummern entfernen.
Sinn der ganzen Sache ist die, dass ich die ID-Nummern aller Empfänger eines Newsletters auswähle, und sie in der $ids speichere.
Die Doppeleinträge können dadurch zustande kommen, dass vorab eine Gruppenauswahl moeglich ist, und es natürlich sein kann, dass ein Empfänger bei mehreren Gruppen ist, jedoch nur einen Newsletter bekommen soll.

Dankk für eure Hilfe,
shinkou

  1. Hello,

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    1. Hi there!

      Super, so wird's sicher klappen. Nur hab ich das Problem, dass meine Variable gar kein Array ist...
      Ich zeig euch mal meine Schleife, die die Variable mit den ID-Nummern erzeugt:

      if ($grp == "1"){
      mysql_select_db($data, $smssql);
      $query_groupsender = "SELECT id FROM table WHERE $gruppe = 1";
      $groupsender = mysql_query($query_groupsender, $smssql) or die(mysql_error());
      $row_groupsender = mysql_fetch_assoc($groupsender);
      $totalRows_groupsender = mysql_num_rows($groupsender);
      $idnr = $row_groupsender['id'];
      $ids = "$ids; $idnr";
      }

      Wie kann ich damit denn ein Array erzeugen? Mit Arrays kenn ich mich noch nicht so gut aus...

      danke,
      shinkou

      1. sorry, hat sich natürlich schon erledigt...

      2. Moin!

        Ich zeig euch mal meine Schleife, die die Variable mit den ID-Nummern erzeugt:

        $query_groupsender = "SELECT id FROM table WHERE $gruppe = 1";

        Du hast IDs, die mehrfach in der DB vorkommen, willst aber nur eine?

        SELECT DISTINCT id FROM table ...

        Und schon hast du das Problem nicht mehr.

        Wobei eigentlich zu fragen ist, warum eine ID, die dem Namen nach eigentlich eindeutig sein sollte, mehrfach vorkommt.

        - Sven Rautenberg

  2. Hallo!

    Nachdem es leider bei PHP keine Hash-Variablen gibt rate ich dir zu einem Sortieralgorithmus....
    Also du fängst am Anfang der Variable an und schreibst den Wert in eine neue Variable. Dann kommt der nächste Wert, der mit dem Inhalt der neuen Variable verglichen wird. Ist er vorhanden dann überspringen, wenn nicht dann in neue Variable einfügen....

    Ich hoffe du verstehst wie ich es meine,

    Martin

    1. Hallo!

      ... rate ich dir zu einem Sortieralgorithmus....

      Ich empfehle Dir die Antwort von Tom, bzw. die von mir zu lesen.

      Beste Gruesze
      Viennamade

      1. Ja das wusste ich leider nicht, da ich mit PHP eigentlich nix am Hut habe und bei Perl Hashes existieren.
        Ich dachte halt, diese Methode funktioniert immer...

        Gruß,
        Martin

      2. hi,

        Ich empfehle Dir die Antwort von Tom, bzw. die von mir zu lesen.

        und ich empfehle, ihm - angesichts der posting-zeiten - wenigstens die _gelegenheit_ dazu zu lassen ;-)

        gruß,
        wahsaga

        --
        http://wazgnuks.net/ - back from the dead
        1. Hello,

          und ich empfehle, ihm - angesichts der posting-zeiten - wenigstens die _gelegenheit_ dazu zu lassen ;-)

          Jetzt musste ich doch erst stutzen, aber das war ja das reinste Trommelfeuer von Antworten fast auf den Punkt.

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        2. Hallo!

          und ich empfehle, ihm - angesichts der posting-zeiten - wenigstens die _gelegenheit_ dazu zu lassen ;-)

          Recht hast Du, aber es war sooo ein schoenes Gefuehl im PHP mal wahrsagen zu duerfen:-)

          Beste Gruesze
          Viennamade

  3. Hallo!

    Ich bitte euch um evtl. Denkanstöße, da ich nach einem ganzen Tag proggen etwas ideenlos bin...

    Meine Variable $ids hat z.B. folgenden Inhalt ",31,43,32,31,31,".
    Ich möchte nun den Inhalt durchsuchen, und evtl. doppelt vorkommende Nummern entfernen.

    array_unique entfernt doppelte Werte aus einem Array. Vorher musyt Du Deinen String halt explodieren oder implodieren (ich musz immer nachschauen welches was macht).

    Die Doppeleinträge können dadurch zustande kommen, dass vorab eine Gruppenauswahl moeglich ist, und es natürlich sein kann, dass ein Empfänger bei mehreren Gruppen ist, jedoch nur einen Newsletter bekommen soll.

    So diese Informationen in einer DB stehen: Geht das nicht im Zuge des SELECT eleganter?

    Beste Gruesze
    Viennamade

    1. Hi!

      Danke für die Info, wollt nur sagen, dass die Gruppen und die gesamte Datenbank dynamisch sind, d.h. es kommen dynmisch spalten hinzu oder eg... deshalb isses bissi schwer...

  4. Moin!

    <?php #ok. wir fangen an...
    $strIDs=",31,43,32,31,31,";

    Um das sinnvoll zu verarbeiten splitten wir das am Komma in einen Array:

    $arIDs=explode(",",$strIDs);

    die alte Textvariable können wir jetzt "vergessen", um Speicher zu sparen

    unset($strIDs);

    Wir legen schon mal einen leeren Array für das Ergebnis der Bemühungen an:

    $arIDsBereinigt=array();

    Wir haben jetzt einen Array und gehen den für jedes Element einmal durch:

    for ($i=0; $i<(count($arIDs)); $i++) {
       # Wir schauen, ob das Element nicht etwa leer ist und hängen es, falls nicht, an einen neuen Array an:
       if ($arIDs[$i] != "") {
          array_push($arIDsBereinigt,$arIDs[$i]);
       }

    # Jetzt gehen wir den Array vom Folgeelement bis zum Ende des Array durch:
       for ($k=$i+1; $k<count($arIDs); $k++) {
          #Wir untersuchen, ob $arIDs[$i]==$arIDs[$k] ist:
          if ($arIDs[$i]==$arIDs[$k]) {
             # Hm. Was könnten wir jetzt tun? Richtig!
             # Wir leeren das k-te Element aus dem Array, das kommt ja mindestens doppelt vor:
             $arIDs[$k]="";
          } # end if
       } # next $k
    } next $i

    jetzt können wir den alten Array "vergessen", um Speicher zu sparen

    unset ($arIDs);

    Unsere "neuen Werte" stehen in einem Array, den wir (zur Not) mit Implode wieder

    zurückverwandeln können. Das folgende ist also ziemlich optional, ich denke auf

    das Kommate am Beginn des Strings kannst Du verzichten

    $strIDs=implode(",",$arIDsBereinigt);
    unset($arIDsBereinigt)

    Fertig Meister!

    ?>

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
    1. Moin!

      Das lässt sich zwar mit array_unique() auch machen, aber mein beispiel lässt sich noch etwas beschleunigen... nehmt es als Programmierbeispiel

      <?php #ok. wir fangen an...
      $strIDs=",31,43,32,31,31,";

      Um das sinnvoll zu verarbeiten splitten wir das am Komma in einen Array:

      $arIDs=explode(",",$strIDs);

      die alte Textvariable können wir jetzt "vergessen", um Speicher zu sparen

      unset($strIDs);

      Wir legen schon mal einen leeren Array für das Ergebnis der Bemühungen an:

      $arIDsBereinigt=array();

      Wir haben jetzt die Daten in einen Array und gehen den für jedes Element einmal durch:

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

      # Wir schauen, ob das Element nicht etwa leer ist und hängen es, falls nicht,
         # an einen neuen Array an und arbeiten ein wenig daran, sonst nicht:
         if ($arIDs[$i] != "") {
            array_push($arIDsBereinigt,$arIDs[$i]);

      # Jetzt gehen wir den Array vom Folgeelement bis zum Ende des Array durch:
            for ($k=$i+1; $k<count($arIDs); $k++) {

      #Wir untersuchen, ob $arIDs[$i]==$arIDs[$k] ist (Das Element also mehrfach vorkommt):
               if ($arIDs[$i]==$arIDs[$k]) {

      # Hm. Was könnten wir jetzt tun? Richtig!
                  # Wir leeren das doppelte k-te Element aus dem Array:
                  $arIDs[$k]="";

      } # end if
            } # next $k
         } end if
      } next $i

      jetzt können wir den alten Array "vergessen", um Speicher zu sparen

      unset ($arIDs);

      Unsere "neuen Werte" stehen in einem Array, den wir (zur Not) mit Implode wieder

      zurückverwandeln können. Das folgende ist also ziemlich optional, ich denke auf

      das Kommate am Beginn des Strings kannst Du verzichten

      $strIDs=implode(",",$arIDsBereinigt);
      unset($arIDsBereinigt)

      Fertig Meister!

      ?>

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix®

      --
      Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
      1. Hello fastix®,

        haben sie dich irgendwie ausgetauscht? Was für komplizierte und antiquierte Methoden verbreitest Du hier die letzte Zeit? Lesen kann man die Scripte auch nicht. PHP ist "erfunden" worden, um die Programmierung zu vereinfachen und nicht kryptisch zu gestalten.

        Wenn man schon in einer Interpreter-Hochsprache für die Lösung einer Aufgabe eigene Kontrukte aufbaut, obwohl es gute fertige Funktionen dafür gibt, dann verwendet man weitestgehend vorkompilierte Methoden und Funktionen. Das lernen die Kinder schon im Informatikunterricht.

        Aber wenn schon, dann so:

        $gruppen = "10,13,25,7,13,77,101,22,10,9,2";

        $_unchecked = explode(',',$gruppen);
          $_checked   = array();

        foreach($_unchecked as $group)
          {
            $_checked[$group] = 1;
          }

        $_result = array_keys($_checked);

        $gruppen = implode(',',$result);

        Erläuterung:
        In der Variablen $gruppen sind die zu prüfenden Werte als CSV-String gespeichert. Mit Hilfe der Funktion explode() erzeugen wir daraus ein numerisches Array. Dieses Array wird mit der Spezialschleife für Arrays von Anfang bis Ende durchgegangen. Dem vorher als leerem Array angelegten $_checked wird für jedes Element aus $_unchecked ein Element hinzugefügt, das als Index den Wert des zu prüfenden Elementes erhält. Die Zuweisung "=1" ist frei gewählt und kann durch jeden anderen (speichersparenden) Wert ersetzt werden. In Wirklichkeit kommt es hier nur darauf an, einen Index zu erzeugen. Wenn nämlich ein Element in $_unchecked mehrfach vorkommt, der Index also in $_checked bereits vorhanden ist, wird er kein zweites Mal angelegt, sondern nur "überschrieben". Diesen Trick machen wir uns hier zunutze. Nach dem Ende der Schleife benutzen wir die Funktion array_keys() um ein neues numerisches Array $_result zu erzeugen, dass nun die Indexe (Keys) aus $_checked als Werte enthält. Dieses Array können wir nun ganz einfach mit implode() wieder in einen CSV-String verwandeln.

        Nun vergleich mal selbst, was man leichter lesen und verstehen kann. Ich würde es glatt auf eine Abstimmung ankommen lassen.

        #######
        in eigener Sache:
        Ich habe vorhin eine Anregung erhalten, wie wir in der schon mal besprochenen Sache endlich weiterkommen könnten.

        Liebe Grüße aus http://www.braunschweig.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        1. Moin!

          haben sie dich irgendwie ausgetauscht? Was für komplizierte und antiquierte Methoden verbreitest

          Mag sein, meine Lösung ist antiquiert und es ist letztendlich im wahren Leben leichter (und wegen der Performance richtiger) fertige (kompilierte) Funktionen der Interpreter- Hochsprachen zu benutzen. Was mich ein wenig stört ist jedoch, dass heute offensichtlich niemand mehr solche Grundaufgaben wie sortieren, gleiche Elemente suchen etc. "von Hand" lösen kann. Das sind aber wichtige Grundlagen. Das "Blackboxverfahren": $foo = wuenschdirwas($foo); ist zwar nett, aber was, wenn es mal die Funktion wuenschdirwas() nicht gibt?

          Ich weiss noch, als ich meine erste Sprache gelernt habe (BASIC), da gabs einen wesentlich kleineren Funktionsatz aber man hat recht gut gelernt, was Programmieren ist: So schlicht zu denken wie eine Maschine nämlich und die große Aufgabe in kleine, leichte aufzulösen....

          Ich hab schon Leute verzweifeln gesehen, weil die Probleme hatten recht einfache Skripte von Perl nach PHP (oder war es umgekehrt?) umzuschreiben.

          Dann kommen Fragen wie diese... und der arme Frager hat den ganzen Nachmittag dran gesessen :(
          Liegt einfach nur an der schlechten Ausbildung. Aber da kann er nichts dafür. Das ist der Geist der Zeit. (Selbst Seminare für künftige Programmierer sollen nur noch drei Tage dauern: Willi=Machprogrammierer(Willi, "ganz schnell") Andererseits: Lernen Schlosser nicht heute noch das Feilen und Sägen?

          $_result = array_keys($_checked);

          Das ist natürlich tricky und auch nur eine andere Lösung... nicht ohne Raffinesse übrigens.

          Nun vergleich mal selbst, was man leichter lesen und verstehen kann. Ich würde es glatt auf eine Abstimmung ankommen lassen.

          Natürlich meine :), die ist besser kommentiert. Die Schreibweisen mit:

          foo {

          }

          oder:

          bar
          {

          }

          sind aus meiner Sicht Gewohnheitssache. Du verwendest aber dafür eine sehr schlichte Notation und schon stehts wieder 1:1, besonders, weil auch das nur Gewohnheitssache ist. "richtig" macht es keiner von uns beiden.

          MFFG (Mit freundlich- friedfertigem Grinsen)

          fastix®

          --
          Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
          1. Hello,

            Was mich ein wenig stört ist jedoch, dass heute offensichtlich niemand mehr solche Grundaufgaben wie sortieren, gleiche Elemente suchen etc. "von Hand" lösen kann.

            Das ist zwar schade, aber PHP ist nicht der Ort dafür, das zu lernen. Das macht man in Pascal oder C oder vielleicht sogar noch C++.

            Die Schreibweisen mit:

            foo {

            }
            oder:
            bar
            {

            }
            sind aus meiner Sicht Gewohnheitssache.

            foo {
                 ...  # Einrückung vier
             }

            ist PEAR-Standard. Aber genau diese Konvention sorgt immer wieder für ärgerliche Fehler und Unlesbarkeiten. Darum habe ich für unsere Programme festgelegt, die andere Schreibweise zu benutzen.

            bar
              {
                ... # Einrückung zwei
              }

            Daraufhin ist die Fehler- und Nachbesserungsquote auf die Hälfte gesunken. Der Durchsatz hat sich entsprechend erhöht. Irgendwann zahlt sich das dann aus.

            Liebe Grüße aus http://www.braunschweig.de

            Tom

            --
            [ Sommercamp für PHP-Anwender in den Sommerferien. Programmieren,
              Sport, Fun, Fete. Teilnehmermindestalter: 14Jahre Info bei mir ]
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen