webForumDet fria alternativet

Få in klassnamn i foreach-loop?

PHP

5 svar · 1 448 visningar · startad av bassebhu

Medlem sedan nov. 20016 480 inlägg
Frågan#1

Edit 3/ Det blev mycket text här, men jag tror att det fetmarkerade nedan är det som den här tråden till slut kokades ner till. Skippa resten och hjälp mig gärna att lista ut hur jag söker i en array :)

Efter ett försök att slingra mig ur problemet går jag till kärnan i stället och försöker lösa det. Jag skrev i HTML/CSS-forumet om hur jag ville formatera kategorier olika beroende på vilken typ det är (huvudkategori, underkategori eller vanlig kategori). I följande kod har jag sett till att varje <ul> och <li> får en klass som säger vilken nivå man är på (level-X).

Men hur får jag in tre olika klasser som säger t.ex. "main_cat", "sub_cat" och "cat" utöver/i stället för level-X?

Eller en kanske lättare fråga, i den här koden, hur kollar jag om en kategori har några underkategorier eller inte? Det finns redan en $has_childs-variabel, men den gäller bara för varje <ul>.

Luddigt beskrivet, men tack till tips i rätt riktning! :)

Edit 1/ I ett försök att förtydliga vad jag vill göra så är det nog kort och gott att söka igenom arrayen $get_cats och se om den aktuella kategorin har några underkategorier och om ja sätta dit klassen "main_cat" eller "sub_cat" och om inte sätta dit "cat". Men hur gör man det? Motsvarande i sql: "WHERE parent = $id" och om rad inte returneras alltså printa dit ett "cat".

Edit 2/ OK, jag försöker smalna ner det ytterligare :) Går det att kolla efter ett värde i en array med nyckeln som wildcard eller nåt?
Om $get_cats['parent'] == $key då finns det underkategorier till $key, hehe :)
Helt enkelt att kolla om det existerar en arraypost som har ett parent-värde satt till $key?

Tack!

function print_cats($parent,$level = 0)
{

	global $get_cats;

	$has_childs = false;
	//this prevents printing 'ul' if we don't have subcategories for this category
		
	foreach($get_cats as $key => $value)
	{
		if ($value['parent'] == $parent) 
		{       
			//if this is the first child print '<ul>'                       
			if ($has_childs === false)
			{
				//don't print '<ul>' multiple times                             
				$has_childs = true;
				echo '<ul class="level-' . $level . '">';
			}
			echo '<li class="level-' . $level . '">' . $value['title'];
			print_cats($key, $level + 1);
			//call function again to generate nested list for subcategories belonging to this category
			echo '</li>';
		}
	}
		
	if ($has_childs === true) echo '</ul>';

}

Lite mer kod om det är till någon nytta:

function get_cats()
{
/* ... Databasgrejer ... */

	while($row = mysql_fetch_array($result))
	{
		$get_cats[$row['id']] = array('title' => $row['title'], 'parent' => $row['parent']);
	}

	return $get_cats;
}

$get_cats = get_cats();
print_cats(0);

Databas:
id - parent - title

Medlem sedan okt. 2001538 inlägg
#2

Det måste finnas vackrare och effektivare sätt att göra det här på, men är det något sådant här du menar?

<?php

// test-data to simulate stuff from the database
$categories = array();
$categories[1] = array('title' => '1', 'parent' => 0);
$categories[2] = array('title' => '2', 'parent' => 0);
$categories[3] = array('title' => '3', 'parent' => 0);
$categories[4] = array('title' => '4', 'parent' => 0);
$categories[5] = array('title' => '5', 'parent' => 1);
$categories[6] = array('title' => '6', 'parent' => 1);
$categories[7] = array('title' => '7', 'parent' => 1);
$categories[8] = array('title' => '8', 'parent' => 2);
$categories[9] = array('title' => '9', 'parent' => 3);
$categories[10] = array('title' => '10', 'parent' => 4);
$categories[11] = array('title' => '11', 'parent' => 2);
$categories[12] = array('title' => '12', 'parent' => 3);
$categories[13] = array('title' => '13', 'parent' => 1);
$categories[14] = array('title' => '14', 'parent' => 5);

function print_categories($parent, $level = 0)
{
    global $categories;

    $children = array();

    foreach ($categories as $catID => $arrTitleAndParent)
    {
        if ($arrTitleAndParent['parent'] == $parent)
        {
            $children[$catID] = $arrTitleAndParent;
        }
    }

    foreach (array_keys($children) as $childID)
    {
        unset($GLOBALS['categories'][$childID]);
    }

    if (count($children) > 0)
    {
        echo '<ul class="level-', $level, '">', "\n";

        foreach ($children as $childID => $childData)
        {
            echo '<li id="', $childID, '" class="level-', $level, '">', "\n", $childData['title'], "\n";
            print_categories($childID, $level+1);
            echo '</li>', "\n";
        }

        echo '</ul>', "\n";
    }
}

print_categories(0);

(ledsen att jag ändrade variabelnamn etc, men blev så distraherad i mitt tänkande av get_cats (hämta katter?!) så jag skrev om det.

Medlem sedan okt. 2001538 inlägg
#3

Hehe, kanske är bra om man INTE stirrar sig blind på det fetstilta också så att man glömmer det där med CSS klasser för de olika kategorierna.

Men då har jag ytterligare en fråga, vad är skillnaden på en sub_cat och en cat? Alla kategorier som inte är main_cat är väl en sub_cat till main_cat?

Och om man läser din länk till tråden i HTML/CSS så förstår man det också ;D

Och om jag läser lite till, så att jag faktiskt börjar förstå hur knepigt det här problemet var, så inser jag att jag nog inte är smart nog att klura ut en lösning :(

Medlem sedan nov. 20016 480 inlägg
#4

Hehe, tack för svaren.

Det är bara kategorierna längst ut som ska vara valbara och de faktiska post-kategorierna. Resterande är bara rubriker för att dela in de valbara. Det var alltså de sistnämnda som gjorde att det varierade i nivåer.

Medlem sedan apr. 20117 inlägg
#5

Hejsan

Jag måste ha läst frågan fel men vill du ändra:

level-1 till main_cat
level-2 till sub_cat
level-3 till cat

Om jag har förstått rätt kan du inte bara skapa en indexerad array?

$levels = array(1 => "main_cat", "sub_cat", "cat");

//Hämta "ordet" istället för exempel "level-1"
 echo '<ul class="' . $levels[$level] . '">';

Eller får du fel resultat av funktionen? Om jag är fel ute får du gärna förtydliga problemet med:
-Vart ligger felet? (Funktionen, MySQL, Västragatan 11 osv osv)
-Vad får du för resultat?
-Vilket resultat vill du få?
-Samt eventuella error från PHP, se till att ha error_reporting(-1) högst upp i filen du jobbar med

//Mr.1Buying :birp

Medlem sedan nov. 20016 480 inlägg
#6

Välkommen till wF! :e

Jag har löst det på annat vis, men problemet var att jag ville sätta "cat" på den nivån som var längst ut, vilket kunde vara allt ifrån level-1 till level-3 beroende på om det fanns några underkategorinivåer eller inte.

262 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)