"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

[PHP] Denkfehler + Arrays

moidaschl 07.01.2006 - 00:42 3506 6
Posts

moidaschl

Vollzeit-Hackler
Avatar
Registered: Aug 2002
Location: 1210, ABK-D/L
Posts: 4029
Also ich habe in meiner Datenbank eine Tabelle mit den Speisenkategorien und in einer zweiten Tabelle alle Unterkategorien

Layout
(categories)
Code:
+--------------+----------------+
| categoriesID | categoriesName |
+--------------+----------------+
|            1 | Vorspeisen     |
|            2 | Hauptspeisen   |
|            3 | Nachspeisen    |
|            4 | Getränke       |
|            5 | Sonstiges      |
+--------------+----------------+

(subcat)
Code:
+----------+-------------+-----------+
| 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

Code: PHP
	/* 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 Ausgabe
Code:
Array
(
    [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
Avatar
Registered: Apr 2003
Location: Graz
Posts: 748
edit: del, wegen blödheit :bash:
hab nicht gesehen, dass subcatref dein fk ist...

edit2:
Code: PHP
$mysqlSubQuery = "SELECT * FROM ok_subcat WHERE subcatRef = '".$actualRow['categoriesID']."'"; 
wozu die einfachen hochkommata beim where? ist doch ein int, oder?`

edit3:
Code: PHP
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
Avatar
Registered: Feb 2003
Location: Linz
Posts: 400
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:
Code:
SELECT categoriesName, subcatName 
FROM subcat 
LEFT JOIN categories
ON subcatRef=categoriesID
ORDER BY categoriesID, subcatName
hth

moidaschl

Vollzeit-Hackler
Avatar
Registered: Aug 2002
Location: 1210, ABK-D/L
Posts: 4029
Zitat von gue
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:
Code:
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

Vorspeisen
Suppen, Sonstiges, ...

moidaschl

Vollzeit-Hackler
Avatar
Registered: Aug 2002
Location: 1210, ABK-D/L
Posts: 4029
Damit der post ned zu unübersichtlich wird, hier jetzt:

Hab deine Idee jetzt mal verwirklicht und das schaut nicht so schlecht aus:

Code: PHP
	$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:
Code:
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
Avatar
Registered: Feb 2003
Location: Linz
Posts: 400
Code: PHP
{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
Avatar
Registered: Aug 2002
Location: 1210, ABK-D/L
Posts: 4029
w00t es funktioniert!

großes Dankeschön!

wieder was gelernt :)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz