[PHP] Denkfehler + Arrays

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/php_denkfehler_arrays_156000/page_1 - zur Vollversion wechseln!


moidaschl schrieb am 07.01.2006 um 00:42

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 schrieb am 07.01.2006 um 02:03

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...


gue schrieb am 07.01.2006 um 11:17

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 schrieb am 07.01.2006 um 14:04

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 schrieb am 07.01.2006 um 14:39

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 schrieb am 07.01.2006 um 14:41

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 schrieb am 07.01.2006 um 14:45

w00t es funktioniert!

großes Dankeschön!

wieder was gelernt :)




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2026