Mehrdimensionales Array aus SQL Tabelle bilden

Registrierer

Erfahrenes Mitglied
Ich habe folgende Abfrage, die mir jeweils den Gesamtumsatz pro Mitarbeiter in ein Array schreibt.
Ich benötige allerdings den Umsatz nach aw_id getrennt, das habe ich weiter unten versucht, indem ich zusätzlich nach aw_id gruppiere, was leider nicht funktioniert.
PHP:
$aw = mysql_query("SELECT ma_id, Sum(aw_wert) AS aw FROM haase_ma_statistik GROUP BY ma_id");
while($aw_zeile = mysql_fetch_assoc($aw)) {
  $data1[] = array($aw_zeile['aw'], $aw_zeile['ma_id']);
}
Code:
Array
(
    [0] => Array
        (
            [0] => 27630.75
            [1] => 40
        )

    [1] => Array
        (
            [0] => 27630.75
            [1] => 41
        )

    [2] => Array
        (
            [0] => 17646.3
            [1] => 42
        )

)
Gruppierung zusätzlich nach aw_id
PHP:
$aw = mysql_query("SELECT ma_id, Sum(aw_wert) AS aw FROM haase_ma_statistik GROUP BY ma_id, aw_id");
while($aw_zeile = mysql_fetch_assoc($aw)) {
  $data1[] = array($aw_zeile['aw'], $aw_zeile['ma_id']);
}
erzugt:
Code:
Array
(
    [0] => Array
        (
            [0] => 14298.67
            [1] => 40
        )

    [1] => Array
        (
            [0] => 13332.08
            [1] => 40
        )

    [2] => Array
        (
            [0] => 13332.08
            [1] => 41
        )

    [3] => Array
        (
            [0] => 14298.67
            [1] => 41
        )

    [4] => Array
        (
            [0] => 14298.67
            [1] => 42
        )

    [5] => Array
        (
            [0] => 3347.63
            [1] => 42
        )

)
Das Ergebnis sollte eigentlich folgendes sein:
Code:
Array
(
    [0] => Array
        (
            [0] => 14298.67
            [1] => 13332.08
            [2] => 40
        )

    [1] => Array
        (
            [0] => 13332.08
            [1] => 13332.08
            [2] => 41
        )

    [2] => Array
        (
            [0] => 13332.08
            [1] => 3347.63
            [2] => 42
        )
)

Kennt jemeand eine Lösung?
 
Abgesehen davon, dass deine gewünschte Lösung etwas umständlich ist, sollte die Lösung dafür so aussehen:
PHP:
while ($row = mysql_fetch_assoc($aw)) {
  foreach ($data1 as $i => $value) {
    if (end($value) == $row['ma_id']) {
      $id = array_pop($data[$i]);
      array_unshift($data[$i], $row['aw'], $id);
    }
  }
}
Sinnvoller wäre aber folgendes:
PHP:
while ($row = mysql_fetch_assoc($aw)) {
  $data1[$row['ma_id']][] = $row['aw'];
}
 
Ich bin völlig verblüfft, was man mit eckicken Klammern alles machen kann ;-)

Leider kann ich es nicht verstehen, und warum fängt das Array jetzt mit der id(40) an?

Code:
Array
(
    [40] => Array
        (
            [0] => 14298.67
            [1] => 13332.08
        )

    [41] => Array
        (
            [0] => 13332.08
            [1] => 14298.67
        )

    [42] => Array
        (
            [0] => 14298.67
            [1] => 3347.63
        )

)
PHPlot meckert hier, das das Dataset ungültig wäre, aber das an anderer Stelle.
Ich hab nun versucht mit array_unshift und array_push die fehlenden Werte hinzuzufügen, was mir leider auch nicht gelingt.
Das Ergebnis müsste wie folgt aussehen:
Code:
Array
(
    [0] => Array
        (
            [0] => 14298.67
            [1] => 13332.08
            [2] => 40
        )

    [1] => Array
        (
            [0] => 13332.08
            [1] => 14298.67
            [2] => 41
        )

    [2] => Array
        (
            [0] => 14298.67
            [1] => 3347.63
            [2] => 42
        )

)

Da das Ergebnis aber für mich ziemlich "verklammert" ist, wüsste ich gar nicht wo ich ansetzen kann.
 
Wie gesagt: das, was du möchtest, wird mit dem oberen Beispiel realisiert. Jedoch ist es aus meiner Sicht Unsinn, weil du einerseits IDs hast, und andererseits irgendwelche Fließkomma-Werte. Daher habe ich im unteren Beispiel deine IDs als Indizes genutzt und denen jeweils ein Array mit deinen Fließkomma-Werten zugewiesen – das scheint aus meiner Sicht sinnvoller zu sein.
 
Nur ist es für PHPlot leider so nicht verwendbar, ich glaube das was ich brauche ist einfach nur eine gruppierte Ausgabe des Arrays.
Statt 6 Einträge nur noch 3 in der Gruppe mit der jeweils gleichen ma_id.
Da lese ich gerade, wie das gehen könnte.

Trotzdem vielen Dank für Deine Hilfe!
 
Liest du meine Beiträge eigentlich? Ich habe dir doch deine gesuchte Lösung geliefert!

Entschuldige, vielleicht verstehe ich das nicht.
Die erste Variante führt zu einem Fehler
Code:
 Invalid argument supplied for foreach()
, den ich nicht nachvollziehen kann, und die zweite Variante gibt mir ein Array aus, welches für PHPlot unbrauchbar ist.

Das gewünschte Ergebnis wie hier:
Code:
Array
(
    [0] => Array
        (
            [0] => 14298.67
            [1] => 13332.08
            [2] => 40
        )
 
    [1] => Array
        (
            [0] => 13332.08
            [1] => 14298.67
            [2] => 41
        )
 
    [2] => Array
        (
            [0] => 14298.67
            [1] => 3347.63
            [2] => 42
        )
 
)

kann ich Deinem Beispiel leider nicht entnehmen, weil ich das Ergebnis wie hier ausgegeben noch nicht nachvollziehen kann.
Code:
Array
(
    [40] => Array
        (
            [0] => 14298.67
            [1] => 13332.08
        )

    [41] => Array
        (
            [0] => 13332.08
            [1] => 14298.67
        )

    [42] => Array
        (
            [0] => 14298.67
            [1] => 3347.63
        )

)
 
cracks Ansatz ist schon sauber. Du kannst auf seiner Basis einfach jeweils den Schlüssel (40, 41...) an die Unterarrays anhängen und anschliessend die Schlüssel entfernen

PHP:
// Jedem Unterarray den Schlüssel am Ende anhängen
foreach($data1 as $key => &$node){
    $node[] = $key;
} 
// Die Schlüssel entfernen
$data1 = array_values($data1);
 
Du musst natürlich auch das Array $data1 vorher definieren. Ich bin davon ausgegangen, dass ich nur den Teil dazwischen ersetzt habe und nicht dein ganzes Skript.
 
Ihr habt natürlich beide Recht, das Problem sitzt wie immer vor dem Rechner ;-)
PHP:
  $aw = mysql_query("SELECT ma_id, Sum(aw_wert) AS aw FROM haase_ma_statistik GROUP BY ma_id, aw_id");
  while ($row = mysql_fetch_assoc($aw)) {
    $data1[$row['ma_id']][] = $row['aw'];
  }
  foreach($data1 as $key => &$node){
    $node[] = $key;
  }
  $data1 = array_values($data1);
erzeugt jetzt
Code:
Array
(
    [0] => Array
        (
            [0] => 14298.67
            [1] => 13332.08
            [2] => 40
        )

    [1] => Array
        (
            [0] => 13332.08
            [1] => 14298.67
            [2] => 41
        )

    [2] => Array
        (
            [0] => 14298.67
            [1] => 3347.63
            [2] => 42
        )

)
und damit ist alles vorhanden was benötigt wird.
War ich mit der Gruppierung eigentlich völlig falsch, oder wäre das auch eine mögliche Lösung gewesen?

Und noch eine Frage: Wenn ich der ma_id, hier der 2. Schlüssel (40,41,42) den Schlüssel 0 zuweisen möchte, ist array_ multisort() das richtige Werkzeug, oder müsste ich weiter vorn beginnen?

Ich hab es mit
PHP:
   foreach($data1 as $temp[]){
    $temp[0][0]   = $data1[0][2];
    $temp[0][2]   = $data1[0][0];
    $data1[0][0]  = $temp[0][0];
    $data1[0][2]  = $temp[0][2];
  }
versucht, es wird aber nur das erste Array korrigiert, was mache ich falsch?
 
Zuletzt bearbeitet:
Zurück