Daten aus SQL Array als 3D Matrix ausgeben

#1
Hallo zusammen,

ich sitze hier vor einem Problem und finde leider keinen Ansatz. Ich hoffe auf einen Guru der mir auf die Sprünge hilft.

Ich habe ein Array aus einer SQL Abfrage:
PHP:
Array
(
   [ARTIKEL] => Wadenchaps Cologne-Jr II
    [ARTNR] => 730714
    [BESTAND] => 0
    [ATTRIBUT] => Kid S
    [LIEFFARBE] => R33
    [KLTFARBE] => hellgrau
    [BID] => B_3697_261_DS
)

Array
(
   [ARTIKEL] => Wadenchaps Cologne-Jr II
    [ARTNR] => 730714
    [BESTAND] => 2
    [ATTRIBUT] => Kid M
    [LIEFFARBE] => Q89
    [KLTFARBE] => dunkelbraun
    [BID] => B_3697_262_72
)

Array
(
   [ARTIKEL] => Wadenchaps Cologne-Jr II
    [ARTNR] => 730714
    [BESTAND] => 0
    [ATTRIBUT] => Kid M
    [LIEFFARBE] => R33
    [KLTFARBE] => hellgrau
    [BID] => B_3697_262_DS
)

Array
(
   [ARTIKEL] => Wadenchaps Cologne-Jr II
    [ARTNR] => 730714
    [BESTAND] => 5
    [ATTRIBUT] => Kid S
    [LIEFFARBE] => Q89
    [KLTFARBE] => dunkelbraun
    [BID] => B_3697_261_72
)

Nun versuche ich vergebens diese als 3D Matrix auszugeben ...

Im Kopf sollen hier die [ATTRIBUT] stehen ( gruppiert also nur 1x pro Wert )
Darunter dann die Artikelnummer | Farbe | und der jeweiligen Spalte aus dem Attribut der Bestand.

wie im bild


Ich habe bereits versucht zuerst den Tabellenkopf mit einer group by abfrage zu erstellen
jedoch weiss ich nun nicht wie ich die richtige zuordnung der Bestände und der Frarben in die richtigen Spalten bekomme....

Ich verzweifele langsam bitte helft mir hier mit einem Denkanstoss weiter ....
 
#2
Das SQL währe eine grosse Hilfe und auch wie du dein Array zusammensetzt. Aber naja, ich geh jetzt mal davon aus, du hast einen grossen Array mit den abgebildeten Arrays als Unterarrays. Eine Annahme mangels Wissen über die wahre Struktur.

Hier mal ein ungetesteter Vorschlag
PHP:
//Testarray
$myArray  = array(
    array(
        'ARTIKEL' => 'Wadenchaps Cologne-Jr II'
        'ARTNR' => '730714'
        'BESTAND' => '0'
        'ATTRIBUT' => 'Kid S'
        'LIEFFARBE' => 'R33'
        'KLTFARBE' => 'hellgrau'
        'BID' => 'B_3697_262_DS'
    ),
    array(
        'ARTIKEL' => 'Wadenchaps Cologne-Jr II'
        'ARTNR' => '730714'
        'BESTAND' => '2'
        'ATTRIBUT' => 'Kid M'
        'LIEFFARBE' => 'Q89'
        'KLTFARBE' => 'dunkelbraun'
        'BID' => 'B_3697_262_72'
    )
);
//Header initialisieren. Das erste Feld ist ein Leerfeld
$header = array('');
$target = array();
foreach ($myArray as $details) {
    $colNr = array_search($details['ATTRIBUT'], $header);
    //Prüfen ob dieser Header bereits exisitert. Wenn ja, hinzufügen
    if($colNr == 0){
        $colNr = count($header);
        $header[$colNr] = $details['ATTRIBUT'];
    }
    //Key erstellen und die Werte ientragen
    $key = "{$details['ARTNR']} {$details['KLTFARBE']}";
    $target[$key][0] = $key;
    $target[$key][$colNr] = $details['BESTAND'];
}

//Alles ausgeben
echo '<table>'
echo '  <tr>';
//Heder ausgeben
foreach ($header as $colNr => $value) {
    echo "      <th>{$value}</th>";
}
echo '  </tr>';
//Pro Key eine Zeile ausgeben
foreach ($target as $key => $cols) {
    echo '  <tr>';
    for ($colNr = 0; $colNr < count($header); $colNr++) {
        //Falls die Spalte einen Eintrag hat, den ausgeben ansonsten 0
        $value = isset($cols[$colNr]) ? $cols[$colNr] : 0;
        echo "      <td>{$value}</td>";
    }
    echo '  </tr>';
}
echo '</table>';
 
#4
Hi Yaslaw,
das richtige Array (Auszug) sieht so aus.
PHP:
$myArray  = array(
    array(
        'ARTIKEL' => 'Wadenchaps Cologne-Jr II'
        'ARTNR' => '730714'
        'BESTAND' => '0'
        'ATTRIBUT' => 'Kid S'
        'LIEFFARBE' => 'R33'
        'KLTFARBE' => 'hellgrau'
        'BID' => 'B_3697_262_DS'
    ),
       array(
        'ARTIKEL' => 'Wadenchaps Cologne-Jr II'
        'ARTNR' => '730714'
        'BESTAND' => '6'
        'ATTRIBUT' => 'Kid S'
        'LIEFFARBE' => 'R33'
        'KLTFARBE' => 'dunkelbraun'
        'BID' => 'B_3697_262_RS'
    ),
        'ARTIKEL' => 'Wadenchaps Cologne-Jr II'
        'ARTNR' => '730714'
        'BESTAND' => '8'
        'ATTRIBUT' => 'Kid M'
        'LIEFFARBE' => 'R33'
        'KLTFARBE' => 'hellgrau'
        'BID' => 'B_3697_262_22'
    ),
        'ARTIKEL' => 'Wadenchaps Cologne-Jr II'
        'ARTNR' => '730714'
        'BESTAND' => '2'
        'ATTRIBUT' => 'Kid M'
        'LIEFFARBE' => 'Q89'
        'KLTFARBE' => 'dunkelbraun'
        'BID' => 'B_3697_262_72'
    )
);
Ich sehe hier leider noch das Problem das Die ATTRIBUTE mehrmals vorkommen - und gruppieren kann man die doch in einem Array nicht oder?
Das heisst - woher kann man wissen in welcher spalte z.B. Kid M steht.... eine scheiss schwerde nuss für mich ....

Gruss Thomas
 
#5
Ist doch drin
PHP:
$colNr = array_search($details['ATTRIBUT'], $header);
 
#6
Danke ich habe sehr viel dazugelernt und es auch denke ganz gut hinbekommen. Dafür meinen besten Dank dem Dozenten 'YASLAW'

Ich habe nur noch ein letztes Problem mit der sortierung....
Das Attribut ist manchmal Text manchman Dezimalzahlen ..... Hier sollte z.B. bei den Größen nicht das durcheinander sein sonder der Reihenfolge nach.
Ich habe es mit der sort by versucht direkt aus der Datenbank aber auch asort beim array... leider ohne Erfolg.
Wo liegt denn hier mein Denkfehler???

PHP:
ORDER BY dbo.RST_ARTIKELSTAMM.STR_ATTRIBUT";

$stmt_2 = sqlsrv_query( $conn, $sql_attribute );
       if( $stmt_2 === false) {
       die( print_r( sqlsrv_errors(), true) );
       }      
while($art2result = sqlsrv_fetch_array($stmt_2 , SQLSRV_FETCH_ASSOC)){


$myArray[] = array('ARTIKEL' => utf8_encode($art2result['ARTIKEL']),
                   'ARTNR' => $art2result['ARTNR'],
                   'BESTAND' => $art2result['BESTAND'],
                   'ATTRIBUT' => $art2result['ATTRIBUT'],
                   'LIEFFARBE' => utf8_encode($art2result['LIEFARBE']),
                   'KLTFARBE' => utf8_encode($art2result['KLTFARBE']),
                   'LIEFFARBE' => utf8_encode($art2result['LIEFKZ']),
                   'BID' => $art2result['BID']);
                   
}
......

/******** BEGINN ATTRIBUT TEBAELLE ****************************/

//Header initialisieren. Das erste Feld ist ein Leerfeld
$header = array('');
$target = array();
foreach ($myArray as $details) {
   
   
    $colNr = array_search($details['ATTRIBUT'], $header);
    //Prüfen ob dieser Header bereits exisitert. Wenn ja, hinzufügen
    if($colNr == 0){
        $colNr = count($header);
        $header[$colNr] = $details['ATTRIBUT'];
    }
    //Key erstellen und die Werte ientragen
    $key = "{$details['ARTNR']} | {$details['KLTFARBE']} | {$details['LIEFFARBE']}";
    $target[$key][0] = $key;
    $target[$key][$colNr] = "<span class='bestand'>".$details['BESTAND']."</span>";
}
........