Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Mehrdimesionales Array Zusammenfassen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Mehrdimesionales Array Zusammenfassen

    Hallo zusammen,

    ich habe folgendes Array:

    Code:
    $doc = array( 0 => array('type' => 'Datenblatt', 'language' => 'DE', 'file' => 'xyz_de.pdf'),
                  1 => array('type' => 'Datenblatt', 'language' => 'EN', 'file' => 'xyz_en.pdf'), 
                  2 => array('type' => 'Datenblatt', 'language' => 'FR', 'file' => 'xyz_fr.pdf'),
                  3 => array('type' => Zeichnung, 'language' => 'EN, 'file' => 'zeichnung_en.pdf'))
    Nun möchte ich, dass er mir anhand vom Key 'type' das Array zusammenfasst. Das könnte vielleicht dann so aussehen:

    Code:
    $doc = array( 0 => array(
                         'Datenblatt' => array( 
                                         0 => array('language' => 'DE', 'file' => 'xyz_de.pdf'),
                                         1 => array('language' => 'EN', 'file' => 'xyz_en.pdf'), 
                                         2 => array('language' => 'FR', 'file' => 'xyz_fr.pdf')
                         ),
                  1 => array(
                         'Zeichnung' => array( 
                                         0 => array('language' => 'DE', 'file' => 'zeichnung_de.pdf')
                          )
                )
    Ich hoffe ihr versteht mein Anliegen

    Viele Grüße

  • #2
    Moin,

    hast du schon eigene Ansätze anzubieten?
    [URL]http://hallophp.de[/URL]

    Kommentar


    • #3
      Ich habe es mal mit array_unique probiert, aber ohne Ergebnis.

      Die Daten (Datenblatt, EN und xyz_de.pdf) kommen aus einer ewig großen und verschachteltem Array.

      Kommentar


      • #4
        Mit array_unique entfernst du doppelte Einträge, also nicht das, was du machen möchtest, oder? Du könntest zunächst mal ein neues Array initialisieren
        Code:
        $result = array();
        und dann anfangen das Array $doc zu durchlaufen. Ich würde dabei dann aber etwas von deiner geforderten Struktur abweichen und die erste Ebene im Array weglassen, sodass es so aussieht:
        Code:
        Array
        (
            [Datenblatt] => Array
                (
                    [0] => Array
                        (
                            [language] => DE
                            [file] => xyz_de.pdf
                        )
        
                    [1] => Array
                        (
                            [language] => EN
                            [file] => xyz_en.pdf
                        )
        
                    [2] => Array
                        (
                            [language] => FR
                            [file] => xyz_fr.pdf
                        )
        
                )
        
            [Zeichnung] => Array
                (
                    [0] => Array
                        (
                            [language] => EN
                            [file] => zeichnung_en.pdf
                        )
        
                )
        
        )
        Denn was hast du mit der ersten Ebene vor? Diese ist unnötig, oder nicht?

        Während du das Array $doc durchläufst, prüfst du immer, ob bereits ein Schlüssel existiert, der den Namen hat, wie das aktuelle Element unter dem Schlüssel type. Wenn nicht, fügst du ein neues Array unter dem Schlüssel hinzu:
        PHP-Code:
        $result = array();
        foreach (
        $doc as $el) {
          if (!
        array_key_exists($el['type'], $result)) {
            
        $result[$el['type']] = array();
          }

          
        // ...

        Dann musst du lediglich noch die restlichen Einträge unter language und file aus dem Array in dein Ergebnisarray schieben. Dabei kann dir z.B. http://php.net/array_splice behilflich sein.
        [URL]http://hallophp.de[/URL]

        Kommentar


        • #5
          Super vielen Dank habs nun hinbekommen!

          Für alle die einen ähnlichen Ansatz suche, hier die Lösung:

          Code:
          $result = array();
            $u = 0;
            foreach($doc as $el) {
              if(!array_key_exists($el['type'], $result)) {
                  $result[$el['type']] = array();
              }
              $result[$el['type']][$u]['language'] = $el['language'];
              $result[$el['type']][$u]['file'] = $el['file'];
                
              $u++;
            }

          Kommentar


          • #6
            Mit array_slice() sparst du dir noch die ein oder andere Zeile
            PHP-Code:
            $result = array();
            foreach (
            $doc as $el) {
              if (!
            array_key_exists($el['type'], $result)) {
                
            $result[$el['type']] = array();
              }

              
            $result[$el['type']][] = array_slice($el1);

            [URL]http://hallophp.de[/URL]

            Kommentar


            • #7
              array_splice() habe ich bisher noch nicht verwendet, aber das läuft ja super

              DANKE

              Kommentar


              • #8
                Ups, habe mich sogar vertan, ich meinte PHP: array_slice - Manual. array_splice funktioniert zwar ebenso, kann aber noch mehr und ist daher vermutlich inperformanter.

                Habe mal die Funktion in meinem Codeschnipsel geändert.

                Gruß
                [URL]http://hallophp.de[/URL]

                Kommentar

                Lädt...
                X