PHP Werte eines Arrays in bestimmte Array-Struktur schreiben

O

Offline

Gast
Hi,

ich habe ein CMS (Drupal 6) aufgesetzt und auch schon ein paar simple Module geschrieben.

Jetzt habe ich ein Problem da ich nicht weiß, wie ich bestimmte Werte eines Arrays in
eine andere bestimmte (und nur die) Array-Struktur in einer (aktuell sind es zwei) foreach-Schleifen schreiben kann.

Erstmal ein bisschen Code:
PHP:
// Funktioniert
$mega = db_query("SELECT * FROM {XY} WHERE aid>0 ORDER BY aid ASC");
while($bla = db_fetch_array($mega)) $infos[$bla["aid"]] = $bla;
// Alle Werte der Tabelle XY werden in $infos geschrieben

Nun lasse ich $infos mit print_r ausgeben und erhalte folgende Array-Struktur:
PHP:
Array
(
    [1] => Array
        (
            [aid] => 1
            [nid] => 51
            [le_name] => STRING
            [address] => STRING
            [phone] => STRING
            [available] => STRING
            [usd] => STRING
            [notice] => STRING
        )

    [2] => Array
        (
            [aid] => 2
            [nid] => 52
            ...
        )

    [3] => Array
        (
            [aid] => 3
            [nid] => 53
            ...
        )

)

Nun möchte ich die Werte der ganzen Attribute in folgende Struktur umschreiben:
PHP:
$infos = array(
        array("A-ID", [aid]),
        array("N-ID", [nid]),
        array("Name", [le_name]),
        array("Anschrift", [address]),
        array("Telefon",  [phone]),
        array("Verfügbar am", [available]),
        array("Gehalt pro Stunde", [usd]),
        array("Weiteres", [notice]),
        );
Ich habe schon etliches versucht, nur will es nicht einfach so klappen wie ich das möchte.
Ich bin auch der Meinung, dass ich mit diesen beiden Foreach-Schleifen den größten Teil geschafft habe:
PHP:
  foreach($infos as $m_a => $m_v){
  // m_a = 1 ... n = ANZAHL DER aids
  // m_v = aid[] ... notice[]

    foreach($m_v as $a => $v){
    // a = aid ... notice
    // v = EINZELNE VALUES DER ATTRIBUTE

    }

  }

Jetzt würde ich gerne wissen wie es am besten hinbekomme.
Versuche ich folgendes bekomme ich schonmal die VALUES, nur habe ich keinen blassen Schimmer
wie ich das in die oben erwähnte Array-Struktur bekomme:
PHP:
$t_l = array(
	'0' => 'A-ID',
	'1' => 'N-ID',
	'2' => 'Name',
	'3' => 'Anschrift',
	'4' => 'Telefon',
	'5' => 'Verfügbar am',
	'6' => 'Gehalt pro Stunde',
	'7' => 'Weiteres',
	);
$t_r = array();
foreach($infos as $m_a => $m_v){
  // m_a = 1 ... n = ANZAHL DER aids
  // m_v = aid[] ... notice[]
	$i=0;
    foreach($m_v as $a => $v){
    // a = aid ... notice
    // v = EINZELNE VALUES DER ATTRIBUTE
		$t_r[$i] = $v;
    }
}
// Jetzt nur noch irgendwie $t_l und $t_r in die o.g. Array-Struktur bringen 
// und ich bin happy
// Habe array_merge() ausprobiert, klappt aber leider nicht

Jetzt liegt es an euch mir zu helfen. :)

Ihr müsst mir natürlich keinen kompletten fertigen und passenden Code geben, ein sehr guter Lösungsanstatz oder eine nützliche Funktion wäre hier auch hilfreich.
 
... naja besser als nichts. :D

Ich habe noch ein bisschen was versucht und habe inzwischen folgenden Code:
PHP:
$content1 = "";
$ausgabe = "";
$ausgabe = "array(";
  foreach($infos as $m_a => $m_v){
  // m_a = 1 ... n = ANZAHL DER aids
  // m_v = aid[] ... notice[]
	  foreach($m_v as $a => $v){
    // a = aid ... notice
    // v = EINZELNE VALUES DER ATTRIBUTE
		$ausgabe .= "array('".$a."',".$v."),";
		// array('ATTRIBUT', VALUE),
	}
  }
$ausgabe .= ");";
$content1 .= $ausgabe;

Nur ist das Problem, dass er $content1 als einen großen String abspeichert und nicht als ein Array mit n weiteren Arrays...
 
Ich bin nicht sicher, ob ich deine gewuenschte Struktur richtig verstanden habe, daher habe ich jetzt einfach mal sowas angenommen:

PHP:
array(
  array("A-ID", 1, 2, 3),
  array("N-ID", 51, 52, 53),
  array("Name", "foo", "bar", "baz")
  // ...
);

Meintest du sowas? Wenn ja, dann ist das ja ziemlich simpel.

PHP:
$result = array(
  array("A-ID"),
  array("N-ID"),
  array("Name"),
  array("Anschrift"),
  array("Telefon"),
  array("Verfügbar am"),
  array("Gehalt pro Stunde"),
  array("Weiteres")
);

foreach ($infos as $info) {
  $result[0][] = $info['aid'];
  $result[1][] = $info['nid'];
  $result[2][] = $info['le_name'];
  // ...
}

Aber wie gesagt: Kann auch sein, dass ich dich falsch verstanden habe. Vor allem hat das nicht viel mit deinem bisherigen Code zu tun. Vielleicht solltest du nochmal ein besseres Beispiel geben, was am Ende rauskommen soll.

Edit: Vielleicht meinst du ja auch sowas:

PHP:
array(
  array("A-ID", 1),
  array("N-ID", 51),
  array("Name", "foo"),
  // ...
  array("A-ID", 2),
  array("N-ID", 52),
  array("Name", "bar")
  // ...
);

Dann waere das hier eine Loesung:

PHP:
$labels = array(
  'aid' => 'A-ID', 
  'nid' => 'N-ID', 
  'name' => 'Name'
  // ...
);

$result = array();

foreach ($infos as $info) {
  foreach ($info as $key => $value) {
    $label = $labels[$key];
    $result[] = array($label, $value);
  }
}

Statt einer Map koennte man fuer die Labels auch eine List nehmen. Dann muss in der inneren Schleife ein Index mitlaufen.

Deine Variablen sind uebrigens schrecklich benannt. Sowas wie "m_a", "m_v" und "t_r" kann spaeter kein Mensch warten. Stattdessen muellst du deinen Code mit Kommentaren zu, die die Variablen erklaeren.
 
Zuletzt bearbeitet:
Hi character,

schonmal danke für deine Antwort. :)

Du hast mich schon richtig verstanden, ich möchte letztere Array-Struktur.
Wende ich deinen PHP-Code an bzw. füge ihn ein und passe die Variablen an erhalte ich folgendes per print_r:
PHP:
Array
(
    [0] => Array
        (
            [0] => A-ID
            [1] => 1
        )

    [1] => Array
        (
            [0] => N-ID
            [1] => 51
        )

    [2] => Array
        (
            [0] => Name
            [1] => ...
        )

    [3] => Array
        (
            [0] => Adresse
            [1] => ...
        )

    [4] => Array
...

Haben möchte ich aber folgendes:
PHP:
Array
(
  [1] => Array
  (
    'A-ID' => '1'
    'N-ID' => '51'
    'Name' => 'STRING'
    'Adresse' => 'STRING'
    'Telefon' => 'STRING'
    'Verfügbar am' => 'STRING'
    'Gehalt pro Stunde' => 'STRING'
    'Weiteres' => 'STRING'
  )
  [2] => Array
  (
    'A-ID' => '2'
    'N-ID' => '52'
    'Name' => 'STRING'
    'Adresse' => 'STRING'
    'Telefon' => 'STRING'
    'Verfügbar am' => 'STRING'
    'Gehalt pro Stunde' => 'STRING'
    'Weiteres' => 'STRING'
  )
  [3] => ...
)

Hier nochmal der Code, den ich anwende:
PHP:
  $labels = array(
  'aid' => 'A-ID',
  'nid' => 'N-ID',
  'le_name' => 'Name',
  'address' => 'Adresse',
  'phone' => 'Telefon',
  'available' => 'Verfügbar am',
  'usd' => 'Gehalt pro Stunde',
  'notice' => 'Weiteres',
  );
  
  $result = array();
  
  foreach($infos as $m_a => $m_v){
    // m_a = 1 ... n = ANZAHL DER aids
    // m_v = aid[] ... notice[]
    
      foreach($m_v as $a => $v){
      // a = aid ... notice
      // v = EINZELNE VALUES DER ATTRIBUTE
      $result[] = array($labels[$a], $v);
      }
    }
Ergänzung ()

Edit:

Danke nochmal @character,

da ich inzwischen neben der auszugebenden Tabelle auch noch einen xls-Export haben möchte wird das mit "nur"-PHP echt langwierig.

Deswegen habe ich nun ein simples Modul (Views) heruntergeladen und mir die Tabelle zusammengeklickt und den xls-Export einfach aktiviert.

Mir hätte es per PHP zwar besser gefallen, nur geht es so einfacher und schneller.

Dennoch danke.
 
Aber du hast doch schon alle Werte und willst nur die Schlüssel umbenennen!
Das kannst du, in dem du die Werte in der Sql-Query änderst:

PHP:
$query = "SELECT
                aid as A-ID,
                nid as N-ID,
                ... und so weiter ...
            FROM 
                {XY} 
            WHERE 
                aid > 0 
            ORDER BY 
                aid ASC";
oder später im PHP-Code:
PHP:
$input = array(
        0 => array(
            "aid" => "1",
            "bla" => "ein wert",
            "blubb" => "muh",
        ),
        1 => array(
            "aid" => "2",
            "bla" => "noch ein wert",
            "blubb" => "muuh",
        )
    );
    print_r($input);

    $output = array();
    foreach ($input as $element) {
        $output[$element["aid"]] = array(
            "A-ID" => $element["aid"],
            "BLA" => $element["bla"],
            "BLUBB" => $element["blubb"],
        );
    }

    print_r($output);
 
Hi Kju,

inzwischen brauche ich das (...) nicht mehr.

Ich hatte vor das Array in einer Funktion von Drupal einzufügen, welche mir dann daraus eine nette Tabelle zaubert.
Nur klappt diese Funktion anscheinend nur in der hook_nodeapi() und nicht in der hook_view().

Das sind so Sachen wo ich mir denke, warum Drupal (bei sowas) so eingeschränkt ist...

Dennoch danke.
 
Zurück
Oben