[PHP] Transformiren eines Daten Array in ein struckturiertes Array

strolch00

redraft.de
ID: 155297
L
21 April 2006
1.684
72
Hi @all,

der Titel klingt zwar doof, aber ich weiß nicht wie ich es besser beschreiben soll.

Also die Gegebenheiten sind zB ein Daten-array aus der DB:
Code:
array(38) {
  [0] => array(4) {
    ["agb_id"] => string(1) "1"
    ["agb_title"] => NULL
    ["agb_message"] => string(162) "Die Allgemeinen Geschäftsbedingungen gelten für alle MKL Mitglieder und werden mit Absendung des Anmeldeformulars für die Dauer der Mitgliedschaft akzeptiert. "
    ["LEVEL"] => string(1) "0"
  }
  [1] => array(4) {
    ["agb_id"] => string(1) "2"
    ["agb_title"] => string(15) "Voraussetzungen"
    ["agb_message"] => NULL
    ["LEVEL"] => string(1) "1"
  }
  [2] => array(4) {
    ["agb_id"] => string(2) "13"
    ["agb_title"] => string(15) "Voraussetzungen"
    ["agb_message"] => string(59) "Für die Anmeldung wird ein aktiver Klammaccount benötigt."
    ["LEVEL"] => string(1) "2"
  }
  [3] => array(4) {
    ["agb_id"] => string(2) "14"
    ["agb_title"] => string(15) "Voraussetzungen"
    ["agb_message"] => string(120) "Die Eingabe des Klamm-Losepasswortes dient nur dem Zweck die KlammID zu bestätigen und wird zu keiner Zeit gespeichert."
    ["LEVEL"] => string(1) "2"
  }
  [4] => array(4) {
    ["agb_id"] => string(1) "3"
    ["agb_title"] => string(9) "Anmeldung"
    ["agb_message"] => NULL
    ["LEVEL"] => string(1) "1"
  }
  [5] => array(4) {
    ["agb_id"] => string(2) "15"
    ["agb_title"] => string(9) "Anmeldung"
    ["agb_message"] => string(48) "Jedes Mitglied darf nur ein MKL Konto eröffnen."
    ["LEVEL"] => string(1) "2"
  }
....

Und nun möchte ich dieses Array in Folgende Strucktur bringen:
Code:
array(13) {
  [0] => array(1) {
    ["message"] => string(162) "Die Allgemeinen Geschäftsbedingungen gelten für alle MKL Mitglieder und werden mit Absendung des Anmeldeformulars für die Dauer der Mitgliedschaft akzeptiert. "
  }
  [1] => array(3) {
    ["id"] => int(1)
    ["title"] => string(15) "Voraussetzungen"
    ["messages"] => array(2) {
      [0] => string(59) "Für die Anmeldung wird ein aktiver Klammaccount benötigt."
      [1] => string(120) "Die Eingabe des Klamm-Losepasswortes dient nur dem Zweck die KlammID zu bestätigen und wird zu keiner Zeit gespeichert."
    }
  }
  [2] => array(3) {
    ["id"] => int(2)
    ["title"] => string(9) "Anmeldung"
    ["messages"] => array(2) {
      [0] => string(48) "Jedes Mitglied darf nur ein MKL Konto eröffnen."
      [1] => string(130) "Die bei der Anmeldung angeforderten Daten sind wahrheitsgetreu anzugeben. Falschangaben können zur Sperrung des Accounts führen."
    }
  }
...

Bisher habe ich mir überlegt das ich mir eine Funktion schreibe mit folgendem Aufruf:
PHP:
    $arrStrucktur = array(
        array('messages' => ':messages'),
        array(
            'id'	               => ':agb_id',
            'title'             => ':agb_categorie',
            'messages'     => array(
                ':agb_message'
            )
        )
    );
    $arrResult = $this->arrayTransform($arrData, $arrStrucktur);

    /**
     * arrayTransform
     */
    protected function arrayTransform($arrData, $arrStrucktur)
    {
        // so nu was hier
        // man könnte noch streiten ob Data Array als Referenz übergeben wird
    }

Habt Ihr für mich einen Denkanstoß, wie man sowas realisieren kann, ich brauche so eine Funktion öfter mal aber Google spuckt so dazu nix aus und PHP hat keine solcher Bordmittel.

Mei Gedanke dazu war das die Strucktur Array Values mit : den bezeichnungen der Schlüssel des Daten Array´s gleichen und man so irgendwie Strucktur Array im einzelnen als "Template" nutzen kann.
Bin mir aber nicht sicher ob des so funktionieren würde wie ich es mir gedacht habe.

Gruß strolch00

ps Schonmal vielen Dank für eure Hilfe.
 
Kannst dich hier ja mal umschauen, ob's da was in der Art gibt:
https://www.google.com/custom?domai...www.phpclasses.org/search.html;FORID:1;&hl=en

Generell waere es wesentlich leichter, wenn das zu erzeugende Array ebenfalls eine einheitliche Struktur haette, und nicht wie in deinem Beispiel:
Code:
array(13) {
  [0] => array(1) {
    ["message"] => string(162) "Die Allgemeinen Geschäftsbedingungen gelten für alle MKL Mitglieder und werden mit Absendung des Anmeldeformulars für die Dauer der Mitgliedschaft akzeptiert. "
  }
  [1] => array(3) {
    ["id"] => int(1)
    ["title"] => string(15) "Voraussetzungen"
    ["messages"] => array(2) {
      [0] => string(59) "Für die Anmeldung wird ein aktiver Klammaccount benötigt."
      [1] => string(120) "Die Eingabe des Klamm-Losepasswortes dient nur dem Zweck die KlammID zu bestätigen und wird zu keiner Zeit gespeichert."
    }
  }

Ansonsten, sofern ich dein Array richtig verstehe, ein ein neues anlegen mit Laenge "Anzahl (LEVEL==1)", ueber das zu transformierende Array iterieren, und je nach "Level" dann entweder den Titel einfuegen, oder halt ein neues Array, mit allen "Level==2" Elementen.

Kommt aber noch auf einige Dinge an, bspw.:
Gibt es auch "Level" > 2 ?
Sollen die ID's der einzelnen Eintraege erhalten bleiben?
Fehlerbehandlung, falls das Input Array nicht der erwarteten Form entspricht etc...
 
Hi jpwfour,

danke für deine Antwort aber bei dem Link war leider nicht das dabei so wie ich es meine.

Ja das mit dem Level war mal so ne Idee, es hatte sich angeboten, weil die Tabelle eben auf Nested Set´d aufbaut. Aber das verwerfe ich gleich wieder. Ich brauche ja die Funktion um generelle SQL Array zu modifizieren.

Ich denke die beste bzw. die generell funktionierenste Idee bisher ist dieses Template Array, wo die Values mit einem :den Key´s des Datan Array´s entsprechen.

Wenn Ihr noch andere Ideen habt sagt es ruhig, bin über jede Hilfe dankbar.

Gruß strolch00