Zitat:
|
Vielen Dank fürs vorlesen Dark Gurdian.
|
Bitte Danke.
Zitat:
Zitat von peter8500 ...negativ  ( |
Du probierst ja auch nur wild herum.
Zerleg dein Problem in Teilprobleme.
1. Dein Ziel ist: Code:
<table>
<tr>
<th>Order 1</th>
<th>Order 2</th>
</tr>
<tr>
<td>Unterorder 1</td>
<td>Unterorder 1</td>
</tr>
<tr>
<td>Unterorder 2</td>
<td>Unterorder 2</td>
</tr>
</table>
2. In welcher Reihenfolge brauchst du die Daten damit das geht?
Antwort: Order 1, Order 2, Unterordner 1 (von Ordner 1), Unterordner 1 (von Ordner 2).... etc.
3. In welcher Reihenfolge liefert der Iterator die Daten?
Antwort (von mir angenommen da es von dir keine Angabe dazu gibt): Ordner 1, Unterordner 1 (von Ordner 1), Unterordner 2 (von Ordner 2), Ordner 2, Unterordner 1 (von Ordner 2)... etc.
4. Wie bekommst du Struktur A in Struktur B?
---> Das ist dein eigentliches Problem. Oder anders formuliert: Mit dem Gruppenbruchverfahren nach der Ordnertiefe hast du eine Aufteilung nach Spalten, du brauchst aber eine Aufteilung nach Zeilen, da sich HTML Tabellen nur zeilenweiße aufbauen lassen (was dir durch SelfHTML deutlich werden sollte).
PHP-Code:
//die Ausgangssituation
$arrayList = array('O 1', 'UO 1', 'UO 2', 'O 2', 'UO 1', 'UO 2', 'UO 3', 'O 3');
//das Ziel
$arrayRows = array();
//der weg
$currentCol = 0; //wir merken uns die spalte in der wir sind/
foreach ($arrayList AS $value) {
if (strpos('UO', $value)===false) { //das kriterium wann wir eine spalte verlassen, hier als Beispiel: wenn UO in wert nicht vorkommt
$currentRow = 0; //wir setzen unseren Zeilenzähler auf die erste Zeile
$currentCol++; //wir erhöhen die Spalte um 1
}
if (!is_array($arrayRows[$currentRow])) {
$arrayRows[$currentRow] = array(); //wir legen für die Zeile ein unterarray an, falls es noch kein ist um vorhandene werte nicht zu überschreiben
}
$arrayRows[$currentRow][$currentCol] = $value; //wir hängen den aktuellen wert an die Zeile an
$currentRow++; //wir erhöhen unseren Zeilenzähler um 1, womit der nächste wert in der nächsten Zeile landet
}
Was passiert da?
Die Schleife durchläuft alle Werte wie bei dir. Als erstes erfolgt eine
Prüfung ob ein Ordner (O), oder ein Unterordner (UO) vorliegt. Wenn kein Unterordner vorliegt, setzen wir den Zähler für die Zeile in der wir uns befinden wieder auf 0. Das heißt wir kehren zur ersten Zeile zurück. Danach wird für diesen Zeileindex ein Unterarray erzeugt welches die Werte für uns festhält, welche in diese Zeilen gehören. Dann wird der Wert an das Array der aktuellen Zeile angehängt (mit dem Index aus $currentCol) und die Zeile um 1 erhöht.
Code:
Array (
0 => Array (
0 => 'O 1'
)
);
So sieht unser Array $arrayRows nach dem ersten Schleifendurchlauf aus. $currentRow steht jetzt auf 1.
Da $currentRow 1 ist, und UO im nächsten Wert vorkommt wird es nicht auf 0 zurück gesetzt, womit unser Array nach dem zweitem Durchlauf so aussieht:
Code:
Array (
0 => Array (
0 => 'O 1'
)
1 => Array (
0 => 'UO 1'
)
);
Das zieht sich so weiter bis der nächste Wert ohne UO kommt, hier "O 2". Jetzt wird $currentRow wieder auf 0 gesetzt und $currentCol um 1 erhöht (jetzt den Wert 1). Daher sieht das Array nach dem Durchlauf so aus:
Code:
Array (
0 => Array (
0 => 'O 1',
1 => 'O 2'
)
1 => Array (
0 => 'UO 1'
)
2 => Array (
0 => 'UO 2'
)
);
Der Zähler steht dann erneut auf 1. Womit UO 1, welches nach dem zweitem O 2 kommt, in nächsten Zeile angehängt wird.
Code:
Array (
0 => Array (
0 => 'O 1',
1 => 'O 2',
2 => 'O 3'
)
1 => Array (
0 => 'UO 1',
1 => 'UO 1'
)
2 => Array (
0 => 'UO 2'
1 => 'UO 2'
)
3 => Array (
1 => 'UO 3'
)
);
$currentCol ist der Index für das Unterarray. Dieser wird gebraucht da ansonsten im Beispiel "UO 3" den Index 0 bekommen würde, und somit in der ersten Spalte landet, obwohl er in die 2te gehört.
Daraus kann man nun eine HTML Tabelle generieren.
Zu beachten sind: Die erste Zeile enthält 3 Einträge, daher muss jede Zeile 3 Spalten (td-Elemente) haben. Alle Zeilen haben aber nur 2. D.h. sie müssen auf 3 aufgefüllt werden. Die letzte Zeile hat nur ein Element an der mittleren Position 1. Die Spalten 0 un2 2 sind nicht belegt, weswegen auch hier entsprechend aufgefüllt werden muss.
Zur Verdeutlichung:
PHP-Code:
echo '<table>';
foreach ($arrayRows AS $columns) {
echo '<tr>';
foreach ($columns AS $value) {
echo '<td>'.$value.'</td>';
}
echo '</tr>';
}
echo '</table>';
würde ausgeben:
Code:
<table>
<tr>
<td>O 1</td>
<td>O 2</td>
<td>O 3</td>
</tr>
<tr>
<td>UO 1</td>
<td>UO 1</td>
</tr>
<tr>
<td>UO 2</td>
<td>UO 2</td>
</tr>
<tr>
<td>UO 3</td>
</tr>
</table>
korrekt ist aber:
Code:
<table>
<tr>
<td>O 1</td>
<td>O 2</td>
<td>O 3</td>
</tr>
<tr>
<td>UO 1</td>
<td>UO 1</td>
<td></td>
</tr>
<tr>
<td>UO 2</td>
<td>UO 2</td>
<td></td>
</tr>
<tr>
<td></td>
<td>UO 3</td>
<td></td>
</tr>
</table>
Wenn du es verstanden hast sollte eine Übertragung auf deinen Fall kein Problem mehr sein. Wenn nicht lass dir von deinem Ausbilder o.Ä. helfen. Wenn du das selbstständig machst dann schau dir die entsprechenden Grundlagen dazu an:
-> HTML Tabellen
-> Arrays mit mehreren Dimensionen
-> Verschachtelte Schleifen
-> Gruppenbruch