Array nach gleichen Elementen durchsuchen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Array nach gleichen Elementen durchsuchen

    Hallo zusammen,

    ich habe ein Array erzeugt, welches die Inhalte einer Datenbankspalte enthält.

    Ich suche nun nach einer Möglichkeit, dieses Array so zu durchsuchen, dass gleiche elemente angezeigt werden, um sie dann weiterverarbeiten zu können.



    HINTERGRUND:

    In der besagten Spalte ist ein String von Käuferdaten. Hier kann ich sehen, welcher Käufer ein Produkt gekauft hat. Leider ist die Datenbank vom eigentlichen Programmierer sehr schlecht aufgebaut worden, so dass ich im nachhinein das Nachsehen habe.

    Ziel ist es, besagte doppelte Einträge herauszusuchen, also wenn ein KÄufer mehrfach Artikel gekauft hat, dann in einer anderen Tabelle zu schauen, zu was für Konditionen er gekauft hat, um dann die Endsumme errechnen zu können.

    Für Vorschläge bin ich mehr als dankbar.


    Gruss Dennis

  • #2
    Zeig doch mal bitte dein Datenbankschema und die Query für die Daten des Arrays. Ich glaube fest daran, dass man das Problem der Datenbank überlassen kann.

    Kommentar


    • #3
      Wie sieht dein Array denn aus?
      gruss Chris

      [color=blue]Derjenige, der sagt: "Es geht nicht", soll den nicht stoeren, der's gerade tut."[/color]

      Kommentar


      • #4
        Also die Tabelle ist unter anderem so aufgebaut (Payments):

        ItemID Buyer


        Die Einträge in ItemID sind nur ids mit denen ich dann in einer anderen Tabelle nach dem jeweiligen Produkt und dem dazugehörigen Preis suchen kann.

        Der Eintrag in Buyer ist schon wesentlich garstiger. Hier setzt sich der Käufer aus einem String zusammen in der Form VORNAME NAME - EMAIL

        Um schon diesen Käufer in der Benutzertabelle ausfindig zu machen, und die Möglichkeit einer geänderten Emailadresse mit in Betracht gezogen, musste ich ein Array der Benutzer in der Form VORNAME NAME erzeugen und mit einem um die TOKEN - EMAIL gekürzten Käufer vergleichen.


        Momentan lese ich folglich einfach die Paymentstabelle aus, speichere alle Buyer um (- EMAIL) gekürzt in einem array, erzeuge ein weiteres Array mit registrierten Benutzern, zähle die Elemente beider Arrays über count() und vergleiche dann beide Arrays, mittels einer doppelten for Schleife, wie folgt:

        PHP-Code:
        //Filtern der Bezahler die auch als Kunden existieren    
            
        for($c=0$c $anzahlB$c++){
                    
                for(
        $d 0$d $anzahlK$d++){
                    
                    if(
        $bezahler[$c] == $kaufer[$d]){ 
        Bei Gleichheit soll nun durch mehrere Funktionen geschaut werden, ob der Käufer, der einen Wert bezahlt hat, andere Käufer gworben hat und wenn ja, ob dieser geworbene ebenfalls bezahlt hat. Dann wird dem eigentlichen Käufer eine entsprechende prozentuale Summe gut geschrieben.
        Das ganze ist soweit realisiert.
        Das Problem ist nun, dass sobald der Käufer mehrfach auftaucht, auch mehrfach die Provision für einen geworbenen bebkommt, weil die Bedingung einfach nur die gesamte Liste der Käufer durchgeht.


        Die SQL quers sind ganz normale SELECT * FROM abfragen ohne grossartige WHERE Klauseln.
        Zuletzt geändert von Timbalord; 28.11.2005, 11:20.

        Kommentar


        • #5
          Das nenn ich mal ne ausführliche erklärung.. Auch wenn ich nichts verstanden habe

          Arrays vergleichen geht bestimmt performanter bzw einfacher als eine doppelte schleife die mit count läuft.

          PHP-Code:
          foreach ($array1 as $element)
          {
            if (
          in_array($element$array2)) // tu was

          Die Datenbankstruktur wäre interessant bzw ein print_r deiner beiden Arrays mit Testdaten.
          gruss Chris

          [color=blue]Derjenige, der sagt: "Es geht nicht", soll den nicht stoeren, der's gerade tut."[/color]

          Kommentar


          • #6
            Aha, ZWEI Arrays! Woher ist der andere (Schema, Beziehungen zur anderen Tabelle, SELECT-Query)?

            (Mein Glaube wird stärker!)

            Kommentar


            • #7
              Leider kann ich die foreach Funktion nicht verwenden, da ich auf den Index und die Reihenfolge angewiesen bin.

              Ich kann nur über den Index weitere Ergebnisse aus anderen Tabellen ziehen.




              Ich sage ja, die DB ist scheisse geplant worden. Oder auch gar nicht.

              Kommentar


              • #8
                Also die wichtige Tabelle wie gesagt

                ItemID Buyer



                Die Kundentabelle

                AffID NAME VORNAME usw usw


                Eine Beziehung zwischen beiden Tabellen existiert nicht. Ich muss die Beziehung simulieren durch den Vergleich zum einem aus den Einträgen in Buyern und einem String den ich erzeuge aus VORNAME und NAME aus der Kundentabelle.

                Abfrage der Kundentabelle
                PHP-Code:
                $sql "SELECT * FROM Affiliates";
                        
                $results mysql_query($sql);    
                        
                $i 0;
                        while(
                $affall mysql_fetch_array($results)){
                            
                $kaufer[$i] = $affall[FName]." ".$affall[LName];//Array erzeugen
                            
                $id[$i] = $affall[AffID];
                                
                $i++;
                                
                        
                        }
                           
                $anzahlK count($kaufer); 
                Abfrage der Käufertabelle
                Listing 1
                PHP-Code:
                $sql1 "SELECT * FROM Payments";
                        
                $results1 mysql_query($sql1);
                        
                $j 0;
                        while(
                $payment mysql_fetch_array($results1)){
                            
                $bezahler[$j] = rtrim(strtok($payment[Buyer], "-"));//Email wird abgeschnitten und leerraum am ende entfernt
                            
                $produktId[$j] = $payment[ItemID];
                            
                $j++;
                            
                            }
                        
                $anzahlB count($bezahler); 

                Dann vergleiche ich beide Arrays mittels der genannten for Schleifen
                Listing 2
                PHP-Code:
                for($c=0$c $anzahlB$c++){
                            
                        for(
                $d 0$d $anzahlK$d++){
                            
                            if(
                $bezahler[$c] == $kaufer[$d]){ 
                und hier ist auch der Grund, wieso ich nicht foreach benutzen kann.
                Ich brauche die Indizes der Arrays, um zum Beispiel die Kunden ID des jeweiligen Käufers herauszufinden. Siehe Listing 1.

                Innerhalb der if Anweisung kann ich dann den jeweilgen Code erst verarbeiten. Sprich herausfinden, ob bezahlt wurde, wieviel und wieviele Kunden der Käufer gworben hat.

                Hier benötige ich zum Beispiel die Indizes
                Listing 3
                PHP-Code:
                //Preis des gekauften Produktes
                                
                $sql2 "SELECT Price FROM Income WHERE (ItemID ='$produktId[$c]')";
                                
                $results2 mysql_query($sql2);
                                
                $price mysql_fetch_array($results2);
                                
                //Berechnen des Anteiligen Gewinns
                                
                $anteile $price[Price] / 50;
                                
                $gewinn1 $anteile $erg1;
                                
                                
                                
                //wen hat der Kunde geworben und 3 stufen unterhalb nach geworbenen suchen
                                
                $f 0;
                                
                $g 0;
                                
                $h 0;
                                
                                
                //1. Level geworbener Mitglieder
                                
                $sql4 "Select * FROM Referrals WHERE (ReferredBy = $id[$c])";//id des WERBERS
                                
                $results4 mysql_query($sql4);
                                if (
                $results4){
                                while (
                $reff1 mysql_fetch_array($results4)){
                                    
                $geworben1[$f] = $reff1[AffID];
                                    
                //Daten des geworbenen
                                    
                $sqlGe1 "SELECT * FROM Affiliates WHERE (AffID = $geworben1[$f])";//DATEN des GEWORBENEN
                                    
                $resultGe1 mysql_query($sqlGe1);
                                    
                $data1 mysql_fetch_array($resultGe1);
                                    if(
                $data1){
                                    
                $nameGe1 $data1[FName]." ".$data1[LName];
                                    
                $idGe1 $data1[AffID];
                                    
                //Suchen ob er was gekauft hat
                                    //echo "ID: ".$idGe1." Ich bin Level 1 Geworbener: ".$nameGe1." und wurde geworben von :".$id[$c]."<br>";
                                    
                                    
                for($a1 0$a1 $anzahlB$a1++ ){
                                            if(
                $bezahler[$a1] == $nameGe1){
                                                
                $produkta1 $produktId[$a1];
                                                    
                                                    
                $sqla1 "SELECT Price FROM Income WHERE (ItemID ='$produktId[$a1]')";
                                                    
                $resultsa1 mysql_query($sqla1);
                                                    
                $pricea1 mysql_fetch_array($resultsa1);
                                                    
                //Berechnen des Anteiligen Gewinns
                                                    
                $anteilea1 $pricea1[Price] / 50;
                                                    
                $gewinn1 += $anteilea1 $erg2;

                                            
                //echo "ID: ".$idGe1." Ich bin Level 1 Geworbener: ".$nameGe1." und wurde geworben von :".$id[$c]." gekauft: ".$produkta1."<br>";    
                                            
                }
                                        }
                                        
                                    } 
                Nachdem ich so nett vom Moderator drauf hingewiesen wurde, dass das 3. Listing zu gross war, habe ich es stark gekürzt. Im Endeffekt wiederholt sich das letzte Listing noch zwei mal.

                Ich weiss einiges hätte ich rekursiv auch lösen können und OOP hätte das ganze nicht den Umfang allerdings bleibt das Problem bestehen.
                Das grösste Problem hier ist, dass es keine Beziehungen zwischen den Tabellen gibt.
                Zuletzt geändert von Timbalord; 28.11.2005, 12:17.

                Kommentar


                • #9
                  Regeln lesen und umsetzen bitte.
                  I don't believe in rebirth. Actually, I never did in my whole lives.

                  Kommentar


                  • #10
                    Wir fragten nach einem DB-Schema, den SELECT's und der Arraystruktur. Du knallst uns nun soviel Code vor den Latz ... sorry, aber ich habe nicht alles gelesen, sondern nur das:
                    PHP-Code:
                    $sql "SELECT * FROM Affiliates";
                    $results mysql_query($sql);    
                    $i 0;
                    while(
                    $affall mysql_fetch_array($results)) {
                        
                    $kaufer[$i] = $affall[FName]." ".$affall[LName];
                        
                    $id[$i] = $affall[AffID];
                         
                    $i++;
                    }
                    $anzahlK count($kaufer);

                    $sql1 "SELECT * FROM Payments";
                    $results1 mysql_query($sql1);
                    $j 0;
                    while(
                    $payment mysql_fetch_array($results1)) {
                            
                    $bezahler[$j] = rtrim(strtok($payment[Buyer], "-"));
                            
                    $produktId[$j] = $payment[ItemID];
                            
                    $j++;
                    }
                    $anzahlB count($bezahler);

                    for(
                    $c=0$c $anzahlB$c++) {
                        for(
                    $d 0$d $anzahlK$d++) {
                            if(
                    $bezahler[$c] == $kaufer[$d]) {
                                
                    // whatever
                            
                    }
                        }

                    Wie gesagt, ich weiß nicht, welche Mätzchen du später noch mit den Arrays vorhast, aber bis hierher riecht es doch verdammt nach JOIN, findest du nicht auch?

                    Übrigens steht in den Regeln auch, dass man Code bitte so umbrechen soll, dass man nicht Scrollen muß.

                    Kommentar


                    • #11
                      Ich hab da auch nur 3-4 Zeilen gelesen und verstehe nicht was du mit deinen Simulierten Indizes meinst.

                      Abgesehen davon..

                      WHERE tabelle1.kundenname = tabelle2.kundenname (muss ja nicht immer ne ID sein)

                      Ich geb onemorenerd da völlig recht.. Hier STINKS förmlich nach Joins....
                      gruss Chris

                      [color=blue]Derjenige, der sagt: "Es geht nicht", soll den nicht stoeren, der's gerade tut."[/color]

                      Kommentar

                      Lädt...
                      X