[PHP] Denkfehler + Arrays
moidaschl 07.01.2006 - 00:42 3506 6
moidaschl
Vollzeit-Hackler
|
Also ich habe in meiner Datenbank eine Tabelle mit den Speisenkategorien und in einer zweiten Tabelle alle Unterkategorien Layout(categories) +--------------+----------------+
| categoriesID | categoriesName |
+--------------+----------------+
| 1 | Vorspeisen |
| 2 | Hauptspeisen |
| 3 | Nachspeisen |
| 4 | Getränke |
| 5 | Sonstiges |
+--------------+----------------+
(subcat) +----------+-------------+-----------+
| subcatID | subcatName | subcatRef |
+----------+-------------+-----------+
| 1 | Suppen | 1 |
| 2 | Sonstiges | 1 |
| 3 | Aufläufe | 2 |
| 4 | Fisch | 2 |
| 5 | Fleisch | 2 |
| 6 | Sonstiges | 2 |
| 7 | Süßes | 3 |
| 8 | Pikantes | 3 |
| 9 | Cocktails | 4 |
| 10 | Shakes | 4 |
| 11 | Fruchtsäfte | 4 |
| 12 | Aufstriche | 5 |
| 13 | Salate | 5 |
+----------+-------------+-----------+
da ich das ganze an smarty übergeben will, will ich die daten in ein mehrdimensionales array verpacken, das ca. so ausschaun sollte [id der hauptkat.][unterkat.] usw, das ich dann einfach mit zwei schleifen das ganze auslesen kann. nur schaut das dann so aus /* Stoebern.php -- Durchsuchen nach Kategorien */
/* Auslesen der Kategorien und der Subkategorien*/
$mysqlQuery = "SELECT * FROM ok_categories ORDER BY categoriesID ASC";
$mysqlResult = mysql_query($mysqlQuery);
while($actualRow = mysql_fetch_array($mysqlResult)) {
$catArray[$actualRow['categoriesID']] = $actualRow['categoriesName'];
$mysqlSubQuery = "SELECT * FROM ok_subcat WHERE subcatRef = '".$actualRow['categoriesID']."'";
$mysqlSubResult = mysql_query($mysqlSubQuery);
while($actualSubRow = mysql_fetch_array($mysqlSubResult)) {
$catArray[$actualRow['categoriesID']]['subName'] = $actualSubRow['subcatName'];
}
}
echo "<pre>";
print_r($catArray);
echo "</pre>";
die AusgabeArray
(
[1] => Sorspeisen
[2] => Sauptspeisen
[3] => Pachspeisen
[4] => Fetränke
[5] => Sonstiges
)
ich bastel jetzt schon eine ganze weile herum, ich hoff ihr könnt mir helfen bzw irgendwie den weg in die richtige richtung deuten. auch kann die ausgabe ganz anders passieren, was euch alles einfällt danke!
|
d3ft0n3
grinder
|
edit: del, wegen blödheit hab nicht gesehen, dass subcatref dein fk ist... edit2: $mysqlSubQuery = "SELECT * FROM ok_subcat WHERE subcatRef = '".$actualRow['categoriesID']."'";
wozu die einfachen hochkommata beim where? ist doch ein int, oder?` edit3: while($actualSubRow = mysql_fetch_array($mysqlSubResult)) {
$catArray[$actualRow['categoriesID']]['subName'
] = $actualSubRow['subcatName'];
meines erachtens schreibst du hier immer auf den selben array-eintrag, deshalb auch nur 5 ausgegebene elemente...
Bearbeitet von d3ft0n3 am 07.01.2006, 02:14
|
gue
Addicted
|
Also du hast da wirklich einen Denkfehler, bzw. weißt du nicht, was du eigentlich machen willst. Du willst, soweit ich das verstanden habe, ein 2-dimensionales assoziatives Array, in dem die Werte der Unterkategorien drinstehen. Warum du dazu (Anzahl Hauptkategorien + 1) Queries benutzt, wo es auch mit einem gehen würde, ist mir dabei nicht ganz klar. Auch nicht, wie dein Array aussehen soll. Also bis jetzt machst du dein erstes Query und schreibst dann in $catArray[1] = "Vorspeisen". Dann später willst du $catArray[1]['subName'] = "Suppen"; zuweisen. Da aber $catArray[1] ein String ist, wird 'subName' numerisch zu 0 ausgewertet und $catArray[1][0], also dem jeweils ersten Buchstaben der Wert vom subCatName zugewiesen. Imho wärs besser, wenn du das catArray ca. so aussehen lässt: $catArray['Vorspeisen'][0] = 'Suppen'; Dazu kannst du aber auch einfach 1 Query verwenden, das jetzt (ungetestet) ca. so aussehen sollte: SELECT categoriesName, subcatName
FROM subcat
LEFT JOIN categories
ON subcatRef=categoriesID
ORDER BY categoriesID, subcatName
hth
|
moidaschl
Vollzeit-Hackler
|
Also du hast da wirklich einen Denkfehler, bzw. weißt du nicht, was du eigentlich machen willst. Du willst, soweit ich das verstanden habe, ein 2-dimensionales assoziatives Array, in dem die Werte der Unterkategorien drinstehen. Warum du dazu (Anzahl Hauptkategorien + 1) Queries benutzt, wo es auch mit einem gehen würde, ist mir dabei nicht ganz klar. Auch nicht, wie dein Array aussehen soll. Also bis jetzt machst du dein erstes Query und schreibst dann in $catArray[1] = "Vorspeisen". Dann später willst du $catArray[1]['subName'] = "Suppen"; zuweisen. Da aber $catArray[1] ein String ist, wird 'subName' numerisch zu 0 ausgewertet und $catArray[1][0], also dem jeweils ersten Buchstaben der Wert vom subCatName zugewiesen. Imho wärs besser, wenn du das catArray ca. so aussehen lässt: $catArray['Vorspeisen'][0] = 'Suppen'; Dazu kannst du aber auch einfach 1 Query verwenden, das jetzt (ungetestet) ca. so aussehen sollte:
SELECT categoriesName, subcatName
FROM subcat
LEFT JOIN categories
ON subcatRef=categoriesID
ORDER BY categoriesID, subcatName
hth ok soweit hab ich verstanden wie du dir das vorstellst und klingt soweit auch logisch. allerdings muss ich im smarty dann mittels einer schleife alles auslesen. das heisst aber, dass ich zb 'Vorspeisen' ja nicht nur im array-identifier mitgeben kann sonder, ich muss ihn ja auch irgendwo als value mitgeben, damit ich ihn auch ausgeben kann. also die ausgabe hätt ich mir ca. so vorgestellt VorspeisenSuppen, Sonstiges, ...
|
moidaschl
Vollzeit-Hackler
|
Damit der post ned zu unübersichtlich wird, hier jetzt: Hab deine Idee jetzt mal verwirklicht und das schaut nicht so schlecht aus: $mysqlQuery = "SELECT categoriesName, subcatName
FROM ok_subcat
LEFT JOIN ok_categories
ON subcatRef = categoriesID
ORDER BY categoriesID, subcatName ASC";
$mysqlResult = mysql_query($mysqlQuery);
while($row = mysql_fetch_array($mysqlResult)) {
$catArray[$row['categoriesName']][] = $row['subcatName'];
}
echo "<pre>";
print_r($catArray);
echo "</pre>";
Ausgabe: Array
(
[Vorspeisen] => Array
(
[0] => Sonstiges
[1] => Suppen
)
[Hauptspeisen] => Array
(
[0] => Aufläufe
[1] => Fisch
[2] => Fleisch
[3] => Sonstiges
)
[Nachspeisen] => Array
(
[0] => Pikantes
[1] => Süßes
)
[Getränke] => Array
(
[0] => Cocktails
[1] => Fruchtsäfte
[2] => Shakes
)
[Sonstiges] => Array
(
[0] => Aufstriche
[1] => Salate
)
)
Jetzt muss ich mir nurnoch überlegen wie ich dann die ersten Elemente durchgehe in einer Schleife, weil es soll ja dynamisch bleiben wenn ich eine kategorie erweitere. bzw wie greif ich jetzt auf die categoriesName direkt zu? oder müsst ich das auch noch irgendwie übergeben hmmm. evtl ein zweites array?
|
gue
Addicted
|
{foreach from=$cat key=catname item=subcat}
<b>{$catname}</b><br>
{foreach from=$subcat item=subcatname}
{$subcatname}
{/foreach}
<br>
{/foreach}
Das ganze ist natürlich nicht besonders sauber. Idealerweise würdest du das ganze mit Objekten machen.
|
moidaschl
Vollzeit-Hackler
|
w00t es funktioniert! großes Dankeschön!wieder was gelernt
|