Fiffi: Zwei Array,s zu einem

Hallo und guten morgen,
leider komme ich bei folgendem nicht weiter....
Mein Eingangs-Array:

  
$wertungen = array(  
array ('ralf',6),  
array ('ziggi',4),  
array ('bobby',6),  
array ('hexe',4),  
array ('willi',3),  
array ('Mika57',5),  
array ('bobby',5),  
);  

Damit bekomme ich wie gewünscht raus:

  
$new_array = array( );  
foreach( $wertungen as $row )  
{  
/* Name als Key und Summe der Punkte vom Namen als Wert ins leere Array */  
$new_array[ $row[0] ] += $row[1];  
}  

[Name] => GESAMT-PUNKTE
Array
(
    [ralf] => 6
    [ziggi] => 4
    [bobby] => 11
    [hexe] => 4
    [willi] => 3
    [Mika57] => 5
)

Nun ermittele ich wie oft ein Name vorkommt (ANZAHL) im Eingangs-Array mit:

  
$vorkommen =array();  
foreach($wertungen as $anz_name)  
{  
$vorkommen[ $anz_name[0] ]    += 1;  
}  

Array
(
    [ralf] => 1
    [ziggi] => 1
    [bobby] => 2
    [hexe] => 1
    [willi] => 1
    [Mika57] => 1
)

Aber ich wie bekomme ich hinter [NAME] und GESAMT-PUNKTE nun noch die ANZAHL ?

Mit foreach klappte das nicht bei mir. array_merge bzw array_combine klappte auch nicht.

Gruss Fiffi

  1. Hello,

    Aber ich wie bekomme ich hinter [NAME] und GESAMT-PUNKTE nun noch die ANZAHL ?

    Wie sieht denn Deine Ziel-Datenstruktur aus?

    $_info = array();
    $_info[$name] = array();

    $_info[$name][$amount] = 0;
    $_info[$name][$count] = 0;
    $_info[$name][$text] = '';

    usw.

    Berücksichtige das in deiner foreach-Schleife für die Zusammenführung.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hallo,

      Wie sieht denn Deine Ziel-Datenstruktur aus?

      Hehe, ich glaube genau das ist seine Frage ;)

      Jeena

      1. Hello Jeena,

        Wie sieht denn Deine Ziel-Datenstruktur aus?
        Hehe, ich glaube genau das ist seine Frage ;)

        Ob ihm das so bewusst war?
        Und ein Beispiel dafür hat von mir auch bekommen...

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hallo,

          Ob ihm das so bewusst war?

          Ich glaube nicht wirklich.

          Jeena

          1. Naja,
            ich muss ja offen eingestehen das, mir leider noch nicht soviel bewusst ist, was array,s angeht.

            Aber ich habe dank Jeena ein Ziel bekommen das mir bei der Ausgabe hilft.

            Gut. ein Problem hab ich noch:

            Und das ist das korrekte sortieren nach:

            Zuerst: Gesamt Punkte und wenn da Gleichstand ist, nach:
            Spiele [ANZAHL]

            Ob ihm das so bewusst war?
            Ich glaube nicht wirklich.

            Aber wie das so ist in PHP (bei mir): Ein Problem gelöst und 20 Neue tauchen wieder auf *gg

            1. Hallo,

              array,s

              seit wann wird das Plural-s durch ein Komma abgetrennt (auch im Thread-Titel)? Den Unfug mit dem Apostroph kenne ich ja schon, aber das ist ja mal eine ganz neue Masche.

              Aber wie das so ist in PHP (bei mir): Ein Problem gelöst und 20 Neue tauchen wieder auf *gg

              Das ist bei anderen Themen auch oft so.
              Merke: In jedem kleinen Problem steckt ein großes, das nur zu gern raus will.  (aus Murphy's Law)

              Ciao,
               Martin

              --
              Letztlich basiert alles auf dem Feuer, dem Rad, der Eins und der Null.
                (Gernot Back)
              Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
              1. Hallo Martin,

                array,s

                seit wann wird das Plural-s durch ein Komma abgetrennt (auch im Thread-Titel)? Den Unfug mit dem Apostroph kenne ich ja schon, aber das ist ja mal eine ganz neue Masche.

                Meine Rechtschreibfehler kannst du gerne behalten.  In der Hinsicht bin ich ein Gönner :-)

                Konstruktive Hilfe ist besser als zu versuchen Andere vorzuführen mit unsachlichen Äusserungen.

            2. Hello,

              Gut. ein Problem hab ich noch:

              Und das ist das korrekte sortieren nach:

              Zuerst: Gesamt Punkte und wenn da Gleichstand ist, nach:
              Spiele [ANZAHL]

              Wie entscheidest Du denn im wirklichen Leben, in welche Reihenfolge Du etwas bringst?
              Du stellst eine Vergleichsregel auf, die Du auf Element + Nachfolger oder Element und Vorgänger anwendest.

              Das Anwenden auf die Elemente eines Arrays nimmt die die PHP-Funktion http://www.php.net/manual/en/function.usort.php ab. Die Vergleichsfunktion musst Du selber erstellen.

              Zeig uns doch mal drei typische Elemente, die Du sortiert haben willst

              ein wenig vereinfacht dargestellt:

              array
              (
                  [1][punkte] => 10
                  [1][anzahl] => 3

              [2][punkte] => 2
                  [2][anzahl] => 1

              [3][punkte] => 10
                  [3][anzahl] => 2
              )

              Nun bracuhst Du nur eine Vergleichsfunktion dafür festzulegen, die als Ergebniss hat für
                  A > B -> 1,
                  A < B -> -1,
                  A == B -> 0,

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
               ☻_
              /▌
              / \ Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
              1. Hallöchen lieber Tom,

                Dein Vorschlag hat mich etwas verwirrt:

                Nun brauchst Du nur eine Vergleichsfunktion dafür festzulegen, die als Ergebniss hat für
                    A > B -> 1,
                    A < B -> -1,
                    A == B -> 0,

                Ich bitte um Verständnis, wenn ich nicht so gut in Mathe oder Logik bin.
                Verstanden habe ich das so:
                wenn: A > B dann 1,
                sonst: A < B dann -1,
                sonst: A == B dann 0,

                Aber  wie mache ich da eine Funktion raus ? usort aus dem Manual hatte ich auch schon in anderen scripten von mir angewendet. Aber da hatte ich nur Zwei Bedingungen.

                Bissl confused bin gerade

                Gruss Fiffi

                1. Hello Fiffi,

                  Dein Vorschlag hat mich etwas verwirrt:

                  War zu erwarten. Ich kenne keinen, der nicht verwirrt war von der "Callback-Funktion", als er sie das allererste Mal vorgesetzt bekommen hat.

                  Nun brauchst Du nur eine Vergleichsfunktion dafür festzulegen, die als Ergebniss hat für
                      A > B -> 1,
                      A < B -> -1,
                      A == B -> 0,

                  Ich bitte um Verständnis, wenn ich nicht so gut in Mathe oder Logik bin.
                  Verstanden habe ich das so:
                  wenn: A > B dann 1,
                  sonst: A < B dann -1,
                  sonst: A == B dann 0,

                  Genau so ist es gemeint. So steht es nämlich im Manual.

                  Aber  wie mache ich da eine Funktion draus ? usort aus dem Manual hatte ich auch schon in anderen scripten von mir angewendet. Aber da hatte ich nur Zwei Bedingungen.

                  function result_cmp($_a, $_b)
                  {
                      if ($_a['punkte'] > $_b['punkte']) return 1;   ## A ist > als B

                  if ($_a['punkte'] == $_b['punkte'])
                      {
                          if ($_a['anzahl'] > $_b['anzahl']) return 1;  ## A ist > als B
                          if ($_a['anzahl'] == $_b['anzahl']) return 0; ## A ist == B
                          return -1;                                    ## A ist < als B
                      }

                  return -1;                                        ## Es bleibt bur, dass A < B sein muss
                  }

                  Das ist jetzt keine saubere Strukturierte Programmierung nach Nassi Shniderman,
                  http://de.wikipedia.org/wiki/Nassi-Shneiderman-Diagramm
                  denn da fehlen die expliziten ELSE-Zweige. Aber Du kannst sie hoffentlich sofort lesen und verstehen in dieser verkürzten Schreibweise.

                  Die Funktion lässt sich auch noch weiter zusammanfassen. Aber das kannst Du mal selber versuchen.

                  Nun kannst Du diese Funktion in usort() http://www.php.net/manual/en/function.usort.php benutzen und hoffen, dass sie funktioniert ;-)

                  Für die Produktivumgebung müsste man außerdem noch sicherstellen, dass das zu prüfende Array das passende Format hat. Das könnte man in diese Funktion verlagern, oder besser eine eigenständige Prüfung vornehmen, bevor der Vergleich gestartet wird.

                  Liebe Grüße aus dem schönen Oberharz

                  Tom vom Berg

                  --
                   ☻_
                  /▌
                  / \ Nur selber lernen macht schlau
                  http://bergpost.annerschbarrich.de
                  1. Lieber Tom,
                    danke für deine Hilfestellung.

                    function result_cmp($_a, $_b)
                    {
                        if ($_a['punkte'] > $_b['punkte']) return 1;   ## A ist > als B

                    if ($_a['punkte'] == $_b['punkte'])
                        {
                            if ($_a['anzahl'] > $_b['anzahl']) return 1;  ## A ist > als B
                            if ($_a['anzahl'] == $_b['anzahl']) return 0; ## A ist == B
                            return -1;                                    ## A ist < als B
                        }

                    return -1;                                        ## Es bleibt bur, dass A < B sein muss
                    }

                    Der Vorschlag klappt nicht, da mein Array diese Struktur hat:

                    Array
                    (
                        [ralf] => Array
                            (
                                [0] => 4
                                [1] => 11
                            )

                    [ziggi] => Array
                            (
                                [0] => 2
                                [1] => 13
                            )

                    [bobby] => Array
                            (
                                [0] => 4
                                [1] => 11
                            )

                    [willi] => Array
                            (
                                [0] => 1
                                [1] => 3
                            )

                    [Mika57] => Array
                            (
                                [0] => 1
                                [1] => 5
                            )

                    )

                    Das hab ich mir angesehen und bin noch verwirrter.

                    Das ist jetzt keine saubere Strukturierte Programmierung nach Nassi Shniderman,
                    http://de.wikipedia.org/wiki/Nassi-Shneiderman-Diagramm
                    Die Funktion lässt sich auch noch weiter zusammanfassen. Aber das kannst Du mal selber versuchen.

                    Nun kannst Du diese Funktion in usort() http://www.php.net/manual/en/function.usort.php benutzen und hoffen, dass sie funktioniert ;-)

                    Jau, das hab ich versucht mit:

                    usort ($result,'result_cmp');
                    angewendet mit:

                    function result_cmp($_a, $_b)  
                    {  
                        if ($_a[1] > $_b[2]) return 1;   ## A ist > als B  
                      
                        if ($_a[1] == $_b[2])  
                        {  
                            if ($_a[1] > $_b[2]) return 1;  ## A ist > als B  
                            if ($_a[1] == $_b[2]) return 0; ## A ist == B  
                            return -1; ## A ist < als B  
                        }  
                      
                        return -1; # Es bleibt nur, dass A < B sein muss  
                    }
                    

                    Nur ich bekomme dabei heraus:
                    Platz Name Punkte Turniere
                    gespielt
                    1 0 3 1
                    2 1 13 2
                    3 2 11 4
                    4 3 11 4
                    5 4 5 1

                    Tut mir leid wenn ich etwas daneben bin. Ich hab versucht deine Funktion auf mein Start-Array anzuwenden, bzw anzupassen.

                    Gruss Fiffi

                    1. Hello Fiffi,

                      danke für deine Hilfestellung.

                      function result_cmp($_a, $_b)
                      {
                          if ($_a['punkte'] > $_b['punkte']) return 1;   ## A ist > als B

                      if ($_a['punkte'] == $_b['punkte'])
                          {
                              if ($_a['anzahl'] > $_b['anzahl']) return 1;  ## A ist > als B
                              if ($_a['anzahl'] == $_b['anzahl']) return 0; ## A ist == B
                              return -1;                                    ## A ist < als B
                          }

                      return -1;                                        ## Es bleibt bur, dass A < B sein muss
                      }

                      Der Vorschlag klappt nicht, da mein Array diese Struktur hat:

                      Du  musst doch jetzt nur die Namen gegen die Indexe austauschen, also

                      'punkte' gegen [1]
                          'anzahl' gegen [2]

                      nehme ich mal an. Du hast ja nicht dokumentiert. Da kann ich nur raten, was was ist.

                      Du hast ab Blödsinn gemacht. Schau es Dir nochmal genau an. Du vergleichst jetzt die Punkte mit der Anzahl.

                      Array
                      (
                          [ralf] => Array
                              (
                                  [0] => 4
                                  [1] => 11
                              )

                      [ziggi] => Array
                              (
                                  [0] => 2
                                  [1] => 13
                              )

                      [bobby] => Array
                              (
                                  [0] => 4
                                  [1] => 11
                              )

                      [willi] => Array
                              (
                                  [0] => 1
                                  [1] => 3
                              )

                      [Mika57] => Array
                              (
                                  [0] => 1
                                  [1] => 5
                              )

                      )

                      Also tausche bitte die Elementbezeicher in der Funktion _richtig_ aus, dann klappt es auch mit dem Vergleich.

                      Liebe Grüße aus dem schönen Oberharz

                      Tom vom Berg

                      --
                       ☻_
                      /▌
                      / \ Nur selber lernen macht schlau
                      http://bergpost.annerschbarrich.de
                      1. Hello,

                        das sollte selbstverständlich [0] und [1] heißen...

                        'punkte' gegen [1]
                            'anzahl' gegen [0]

                        Liebe Grüße aus dem schönen Oberharz

                        Tom vom Berg

                        --
                         ☻_
                        /▌
                        / \ Nur selber lernen macht schlau
                        http://bergpost.annerschbarrich.de
                        1. Hallo lieber Tom,
                          ich habe wirklich bockmist gemacht. Es ist natürlich besser "sprechende" Bezeichner in einem Array zu haben. Deshalb habe ich nun folgendes Ausgangs-Array:
                          Array
                          (
                              [ralf] => Array
                                  (
                                      [punkte] => 11
                                      [gespielt] => 4
                                  )

                          [ziggi] => Array
                                  (
                                      [punkte] => 13
                                      [gespielt] => 2
                                  )

                          [bobby] => Array
                                  (
                                      [punkte] => 11
                                      [gespielt] => 3
                                  )

                          [willi] => Array
                                  (
                                      [punkte] => 3
                                      [gespielt] => 1
                                  )

                          [Mika57] => Array
                                  (
                                      [punkte] => 5
                                      [gespielt] => 1
                                  )

                          )

                          Darauf habe ich mit:
                          usort($result,'result_cmp');
                          Diese Funktion angewendet:

                          function result_cmp($_a, $_b)  
                          {  
                              if ($_a['punkte'] < $_b['punkte']) return 1;   ## A ist < als B  
                            
                               if ($_a['punkte'] == $_b['punkte'])  
                              {  
                                  if ($_a['gespielt'] < $_b['gespielt']) return 1;  ## A ist < als B  
                                  if ($_a['gespielt'] == $_b['gespielt']) return 0; ## A ist == B  
                                  return -1;  ## A ist < als B  
                              }
                          

                          Das führt auch zu dem von mir gewünschten Sortier-Ergebnis.
                          Aber leider sind nun die Namen ausgetauscht mit numerischen Indizie,s
                          Array
                          (
                              [0] => Array
                                  (
                                      [punkte] => 13
                                      [gespielt] => 2
                                  )

                          [1] => Array
                                  (
                                      [punkte] => 11
                                      [gespielt] => 4
                                  )

                          [2] => Array
                                  (
                                      [punkte] => 11
                                      [gespielt] => 3
                                  )

                          [3] => Array
                                  (
                                      [punkte] => 5
                                      [gespielt] => 1
                                  )

                          [4] => Array
                                  (
                                      [punkte] => 3
                                      [gespielt] => 1
                                  )

                          )
                          Aber die Namen brauche ich natürlich :-)
                          Gruss Fiffi

                          1. Hat sich erledigt. Lesen bildet :-)

                            uasort($result,'result_cmp');

                            uasort() - Sortiert ein Array mittels einer benutzerdefinierten Vergleichsfunktion und behält Indexassoziationen bei.

                            Gruss Fiffi und danke für eure Hilfe

                            1. Hello Fiffi,

                              Hat sich erledigt. Lesen bildet :-)

                              uasort($result,'result_cmp');

                              uasort() - Sortiert ein Array mittels einer benutzerdefinierten Vergleichsfunktion und behält Indexassoziationen bei.

                              Na, das ist doch jetzt mal ein Erfolg. Da mag man dann gleich umso lieber wieder weiterbasteln ;-))

                              Liebe Grüße aus dem schönen Oberharz

                              Tom vom Berg

                              --
                               ☻_
                              /▌
                              / \ Nur selber lernen macht schlau
                              http://bergpost.annerschbarrich.de
                              1. Lieber Tom,

                                Na, das ist doch jetzt mal ein Erfolg. Da mag man dann gleich umso lieber wieder weiterbasteln ;-))

                                ja. Und das mit noch mehr Schwung :-)

                                Dir nochmals Lieben Dank für Deine Unterstützung

                                1. Hallöchen,
                                  leider brauche ich in meinem Fall nochmals Hilfe, da ich das letzte Datum noch in meiner Tabelle brauche. Exemplarisch zu einem TimeStamp habe ich in meinem Fall nur kleine Zahlen aufgeführt.
                                  Mein Ausgangs-Array (Name, Punkte, Datum):

                                    
                                  $wertungen = array(  
                                  array ('Fiffi',2,400),  
                                  array ('Mamasschlumpf78',2,400),  
                                  array ('Snoopyy',4,400),  
                                  array ('DJmünstermaus',8,400),  
                                  array ('Meeresreuber481',6,400),  
                                  array ('blauerengel457',5,50),  
                                  array ('Fiffi',8,101),  
                                  array ('blauerengel457',5,100),  
                                  )  
                                  
                                  

                                  Nun habe ich so versucht das letzte "Datum" zum Namen zu bekommen:

                                    
                                  $datum =array();  
                                  foreach($wertungen as $last_date)  
                                  {  
                                  $datum[ $last_date[0] ] = max($last_date);  
                                  // $datum[ $last_date[0] ] = max($last_date[2]); schlägt fehl  
                                  }  
                                  
                                  

                                  Leider stimmt das gar nicht, Weil Fiffi die 400 haben müsste:

                                    
                                  Array  
                                  (  
                                      [Fiffi] => 101  
                                      [Mamasschlumpf78] => 400  
                                      [Snoopyy] => 400  
                                      [DJmünstermaus] => 400  
                                      [Meeresreuber481] => 400  
                                      [blauerengel457] => 100  
                                  )  
                                  
                                  

                                  Liebe Grüsse Fiffi

                                  1. Hi,

                                    leider brauche ich in meinem Fall nochmals Hilfe, da ich das letzte Datum noch in meiner Tabelle brauche.

                                    Nun habe ich so versucht das letzte "Datum" zum Namen zu bekommen:

                                    Was denn jetzt, das „letzte“, innerhalb der gegebenen Reihenfolge der Daten, oder das Maximum?

                                    $datum =array();
                                    foreach($wertungen as $last_date)
                                    {
                                    $datum[ $last_date[0] ] = max($last_date);
                                    // $datum[ $last_date[0] ] = max($last_date[2]); schlägt fehl
                                    }

                                    
                                    >   
                                    > Leider stimmt das gar nicht, Weil Fiffi die 400 haben müsste  
                                      
                                    Also wohl tatsächlich das Maximum, und nicht das „letzte“.  
                                      
                                    
                                    > // $datum[ $last\_date[0] ] = max($last\_date[2]); schlägt fehl  
                                    
                                    Toll - und was soll „schlägt fehl“ jetzt konkret bedeuten?  
                                      
                                      
                                    Wenn du schon deine Probleme nicht selber lösen kannst - dann \*beschreibe\* sie doch bitte wenigstens vernünftig.  
                                      
                                      
                                    Vermutlich bekommst du die Meldung  
                                    
                                    > Warning:  max() [function.max]: When only one parameter is given, it must be an array  
                                      
                                    (Solltest du keine Meldung bekommen, dann hast du das error\_reporting nicht vernünftig eingestellt - in dem Fall mach das bitte als \*allererstes\*. Es ist ein wichtiges Hilfsmittel beim Programmieren. Und wenn dir das nichts sagt, dann informiere dich bitte!)  
                                      
                                    Und die Meldung ist natürlich berechtigt - von nur einem Wert das Maximum ermitteln zu wollen, ist mathematisch reichlich sinnfrei, das wäre nämlich immer genau dieser Wert.  
                                      
                                      
                                    Du könntest einfach abfragen, ob der aktuelle Wert für den jeweiligen Namen größer als der vorherige für diesen Namen ist, und wenn ja, den neuen Wert übernehmen. (Dabei musst du natürlich auch noch überprüfen, ob es überhaupt schon einen Eintrag für diesen Namen gibt.)  
                                      
                                    MfG ChrisB  
                                      
                                    
                                    -- 
                                    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                                    
                                    1. Ich hab es nun doch selber (self) hinbekommen :)

                                      $last_datum = array();  
                                      foreach ($wertungen as $val)  
                                      {  
                                        $name = $val[0];  
                                        $datum = $val[2];  
                                        if(isset($last_datum[$name])) {  
                                          $last_datum[$name] = max($last_datum[$name], $datum);  
                                        } else {  
                                          $last_datum[$name] = $datum;  
                                        }  
                                      }  
                                      

                                      Nun hat sich meine Frage dazu endlich erledigt

                                      Gruss Fiffi

                                      1. Hi,

                                        Ich hab es nun doch selber (self) hinbekommen :)

                                        Ja sicher, selber, schon klar - http://www.php.de/php-einsteiger/82946-erledigt-indiziertes-array-auswerten-2.html#post615658

                                        MfG ChrisB

                                        --
                                        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
                                    2. Hello,

                                      Und die Meldung ist natürlich berechtigt - von nur einem Wert das Maximum ermitteln zu wollen, ist mathematisch reichlich sinnfrei, das wäre nämlich immer genau dieser Wert.

                                      Das bringt mich zu der ketzerischen Frage, ob das für NULL auch gilt? ;-P

                                      Liebe Grüße aus dem schönen Oberharz

                                      Tom vom Berg

                                      --
                                       ☻_
                                      /▌
                                      / \ Nur selber lernen macht schlau
                                      http://bergpost.annerschbarrich.de
                                      1. Hi,

                                        von nur einem Wert das Maximum ermitteln zu wollen, ist mathematisch reichlich sinnfrei, das wäre nämlich immer genau dieser Wert.

                                        Das bringt mich zu der ketzerischen Frage, ob das für NULL auch gilt? ;-P

                                        Mathematik kennt kein NULL, nur 0 ;-P

                                        MfG ChrisB

                                        --
                                        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  2. Hallo,

    <?php  
      
    $result = array();  
    foreach($vorkommen as $key => $value) {  
      
        // Entweder  
        // $result[$key] = array($value, $gesamt_punkte[$key]);  
        // oder  
      
        $anzahl = $value;  
        $wertung = $gesamt_punkte[$key];  
        $result[$key] = array(  
            'wertung' => $wertung,  
            'anzahl' => $anzahl  
        );  
      
    }  
      
    var_dump($result);
    

    In anderen sprachen gibt es dafür "zip" aber ich finde das für PHP jetzt grad nicht.

    Jeena

    1. Huhuuuu Jeena,

      du bekommst einen guten Morgen Bussi von mir. *knutsch

      Mit einer kleinen Änderung:
      statt: $gesamt_punkte[$key]) habe ich
      $new_array[$key]) genommen und.....
      .......

      jaaaaaaaaaaaaa.

      Danke dir 1000 mal für deine Hilfe.

      Liebe Grüsse Fiffi