Announcement

Collapse
No announcement yet.

Gleiche Werte in einem Array ausgeben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Gleiche Werte in einem Array ausgeben

    Hallo an Alle,

    ich möchte aus einem Array mit Nummer ermitteln wie oft welche Nummer vorkommt.

    Beispiel:
    Array = 100,200,300,100,300,400,200,100

    Als Ergebnis möchte ich:

    100 = 3
    200 = 2
    300 = 2
    400 = 1

    Kann mir jemand sagen wie ich das am einfachsten mache? Danke für Eure Hilfe.

    Gruß Nevada

  • #2
    Das Array durchlaufen und jeden gefundenen Wert als Key in eine Hashmap schreiben und dabei als Value die Anzahl erhöhen http://php.net/manual/en/language.types.array.php
    Christian

    Comment


    • #3
      Hallo,

      manchmal hilft einfach ein wenig rtfm.

      PHP Code:
      <?php

      $Arr  
      = array(100,200,300,100,300,400,200,100);

      $cArr array_count_values($arr);

      print_r($Arr);
      print_r($cArr);
      Gruß Falk
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        Die funktion kannte ich nicht
        Christian

        Comment


        • #5
          Danke für die Infos ... ich brauche aber mehr einen praktischen Ansatz, ich schreibe einfach mal genau was ich möchte. Es geht um eine Auflistung von Artikeln in einem Online-Shop die zusammen gekauft worden sind. Also das typische "Diese Artikel wurden oft zusammen gekauft"

          Meine SQL-Abfrage liefert mir ein Ergebnis mit den Artikelnummern als Zeichenkette mit Komma getrennt die ich wie folgt in ein Array einlese:

          PHP Code:
          // hier schaue ich in welchen Belegen der Artikel vorkommt
          $qBeleg mysql_query("select beleg_id from dbo_belegp where artikel_nr = '$artikel->artikel_nr'"); 
          $sBeleg_art "";
          while(
          $aBeleg mysql_fetch_object($qBeleg))
          {
              
          $sBeleg_id $aBeleg->beleg_id;
                        
          // hier schaue ich in den einzelnen Belegen welche Artikel noch gekauft wurden
              
          $qBeleg_art mysql_query("select artikel_nr from dbo_belegp where beleg_id = '$sBeleg_id' and artikel_nr != '$artikel->artikel_nr'");
              while(
          $aBeleg_art mysql_fetch_object($qBeleg_art))
              {
                  
          $sBeleg_art .= $aBeleg_art->artikel_nr.",";
              }
          }
          $array_art explode(",",$sBeleg_art);

          krsort($array_art); // hier will ich nach der Anzahl der verkauften Artikel Sortieren damit ich die ersten 10 weiter verwenden kann

          foreach (array_count_values($array_art) as $key => $val) {
              echo 
          "$key = $val<br>";

          Mein Ergebnis bis zu dieser Stelle:

          92220202500 = 4
          91810401299 = 1
          91410208248 = 3
          92810201853 = 1
          91050158206 = 2
          91010158699 = 3
          92210800199 = 2
          91010303102 = 1
          91020201402 = 1
          91010101446 = 5
          91410200146 = 1 ....

          (ca. 120 insgesamt)

          1. Warum wird das Ergebnis nicht sortiert?
          2. Wie kann ich nur die ersten 10 filtern?

          Am Ende möchte ich einfach nur eine Liste mit den 10 Artikeln, die mit diesem Artikel gemeinsam gekauft wurden. Danke für Eure Hilfe.

          Gruß Nevada

          Comment


          • #6
            Hallo,

            Deine Lösung ist sehr verworren und mir stellen sich ein paar Fragen. Warum schreibst du die Werte erst in eine kommaseparierte Liste um sie dann in ein Array umzuwandeln, statt die Werte gleich in das Array zu schreiben? Was bezweckst du mit krsort($array_art); ?
            krsort sortiert ein Array nach Schlüsseln in umgekehrter Reihenfolge! $array_art ist ein indiziertes Array mit Schlüsseln der Art 0, 1, 2, 3, ...
            Die Funktion array_count_values führt keine Sortierung durch (zumindest steht davon nichts in der Doku). Wieso erwartes du also eine Sortierung? Diese könntest du z.B. mit asort explizit durchführen.
            Die entscheidende Frage ist jedoch: Warum lässt du das nicht die DB in EINER Abfrage erledigen? Die kann das wahrscheinlich wesentlich schneller als deine Schleifen in PHP!

            Gruß Falk
            Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

            Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

            Comment


            • #7
              Hallo Falk,

              das mit der direkten Abfrage in der Datenbank habe ich mir auch schon überlegt, weiss aber nicht so richtig wie ich das mache

              Ich habe eine Tabelle die ungefähr so aussieht. Mein Artikel zu dem ich wissen möchte welche anderen Artikel mit
              dazu gekaft wurden ist 1000:

              ID | Artikelnummer | Beleg |


              1 2000 1
              2 1000 1
              3 3000 1
              4 6000 1

              5 4000 2
              6 1000 2

              7 7000 3
              8 1000 3

              9 6000 4
              10 2000 4
              11 1000 4

              12 2000 5
              13 1000 5
              14 2000 5


              Im Beispiel habe ich insgesamt 5 Belege.
              So, als Ergebnis sollte jetzt folgendes rauskommen:

              Mit dem Artikel 1000 wurden gekauft:

              2000 4x
              3000 1x
              4000 1x
              6000 2x

              Gruß Nevada

              Comment


              • #8
                Hallo,

                bei dem einfachen Tabellenaufbau ist das eigentlich nicht schwer. Du musst die Tabelle mit sich selbst Joinen, um die mitgekauften Artikel (Anhand des Beleges) zu ermitteln. Diese Artikel werden nach Artikelnumer gruppiert, gezählt und dann absteigend nach dieser Anzahl sortiert. Zu guter letzt brauchst du das Ergebnis nur noch auf 10 Datensätze zu limitieren.
                [highlight=sql]
                SELECT t1.Artikelnummer, count(t1.ID) Anzahl
                FROM <Tabelle> t1
                INNER JOIN <Tabelle> t2 ON t2.Beleg = t1.Beleg AND t2.Artikelnummer != t1.Artikelnummer
                WHERE t2.Artikelnummer = 1000
                GROUP BY t1.Artikelnummer
                ORDER BY count(t1.ID) DESC
                LIMIT 10
                [/highlight]

                Gruß Falk
                Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                Comment


                • #9
                  Hallo Falk,

                  danke für die Hilfe!!! Hat super funktioniert!! DANKE!

                  Gruß Nevada

                  Comment


                  • #10
                    Jetzt ist doch noch ein Problem aufgetaucht. In der Tabelle Belege sind Artikel drin die es in der Tabelle Artikel (dbo_artikel) nicht mehr gibt, zum Beispiel wenn der Artikel
                    nicht mehr lieferbar ist. Die obige Abfrage bringt mir natürlich alle Artikel die irgenwann mal in die Tabelle Beleg geschrieben wurden. Wie bekomme ich eine dritte Tabelle (dbo_artikel, Spalte: artikel_nr) in die Abfrage? Hier noch mal die angepasste Abfrage:

                    PHP Code:
                    SELECT a.artikel_nrCOUNTa.artikel_nr Anzahl
                    FROM dbo_belegp a
                    INNER JOIN dbo_belegp b ON b
                    .beleg_id a.beleg_id
                    AND b.artikel_nr != a.artikel_nr
                    WHERE b
                    .artikel_nr ='$artikel->artikel_nr'
                    GROUP BY a.artikel_nr
                    ORDER BY COUNT
                    a.artikel_nr )DESC 
                    LIMIT 7 
                    Danke!!

                    Gruß Nevada

                    Comment


                    • #11
                      Originally posted by Nevada208 View Post
                      ...Wie bekomme ich eine dritte Tabelle (dbo_artikel, Spalte: artikel_nr) in die Abfrage?
                      Die Frage verstehe ich nicht ganz! Was meinst du damit? Im Endeffekt kommt es darauf an, wofür du diese Tabelle benötigst. Soll sie die Datenmenge einfach auf die Menge der aktuellen Artikel einschräncken, dann wäre das einfach ein weiterer JOIN. Wenn es spezieller wird, dann wäre das eher eine Frage fürs Datenbankforum, statt hier in PHP.

                      Gruß Falk
                      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                      Comment


                      • #12
                        Ja genau, die Datenmenge soll auf die aktuellen Artikel eingeschränkt werden.

                        Gruß Nevada

                        Comment


                        • #13
                          Hallo,
                          dann genügt es wenn die Tabelle einfach dazu gejoint wird.
                          [highlight=sql]
                          SELECT a.artikel_nr, COUNT( a.artikel_nr ) Anzahl
                          FROM dbo_belegp a
                          INNER JOIN dbo_artikel c ON c.artikel_nr = a.artikel_nr
                          INNER JOIN dbo_belegp b ON b.beleg_id = a.beleg_id
                          AND b.artikel_nr != a.artikel_nr
                          WHERE b.artikel_nr ='$artikel->artikel_nr'
                          GROUP BY a.artikel_nr
                          ORDER BY COUNT( a.artikel_nr )DESC
                          LIMIT 7
                          [/highlight]

                          Gruß Falk

                          P.S.: Bitte das SQL korrekt formatieren: Formatierung von SQL in Beiträgen
                          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                          Comment

                          Working...
                          X