Klapp Menüs mit Bit Operatoren

avnas

Grünschnabel
Hallo,

ich bin grad dabei ein Menü zu erstellen. Vorherst soll es drei Oberpunkte geben die jeweils 4 Unterpunkte haben.
Beim klick auf einen Oberpunkt soll dieser aufgeklappt werden. Beim erneuten Klick sollte sich dieser wieder zuklappen. Wenn nun einer aufgeklappt ist und es wird auf einen anderen geklickt sollte sich der zweite auch aufklappen. Genauso beim dritten: Wenn zwei aufgeklappt sind sollte sich der dritte auch aufklappen.
Jetzt sind alle drei aufgeklappt. Wird nun auf einen aufgeklappten geklickt sollte sich dieser wieder zuklappen, die anderen beide aber aufgeklappt bleiben.
So was kann man doch mit Bit Operatoren lösen, oder?

Kann mir jemand erklären wie man das am einfachsten macht?

Vielen Dank schon im voraus,
Christoph
 
Zuletzt bearbeitet:
@Lirion: Dann hast du ihn glaub ich falsch verstanden ;)

@avnas:
Beispiel:
PHP:
<?
// 8 == Anzahl der Menüs
for ($i=0; $i<8; $i++) {
	// Neuen Wert zum Öffnen/Schließen erzeugen
	// (entsprechendes Bit umkehren)
	$linkvar = $var ^ (1<<$i);
	echo "<a href=\"?var=".$linkvar."\">";
	// Prüfen ob ensprechendes Bit gesetzt oder nicht
	// (== geöffnet oder geschlossen)
	if ($var & 1<<$i) {
		echo "[-]</a> offen";
	} else {
		echo "[+]</a> geschlossen";
	}
	echo "<br>";
}
?>
Sollte relativ selbsterklärend sein, denke ich.
 
Hallo,

danke für die Antwort. Nur leider passiert da bei mir gar nichts. D.h. es wird nur ausgegeben. [+] geschlossen. Wenn ich jetzt da auf das + klicke sollte doch zumindest [-] offen stehen. Ausserdem stellt sich mir jetzt noch die Frage wie ich daraus ein Menü mit Unterpunkten baue. Irgendwie raff ich das ganze ned so ganz *g*

Wär nett wenn du mir das mal ein bisschen genauer erklären könntest.

Grüße,
Chris
 
Hm, ich bin jetzt wohl fälschlicherweise von register_globals=on ausgegangen, mein Fehler :)

Schreib einfach in die erste Zeile noch vor der for-Schleife das hier:
Code:
$var = $_GET['var'];

Wie du daraus jetzt ein Menü machst? Tja, da gibt's mehrere Ansätze... ich kann ja mal auf die schnelle was zusammenhacken...
 
Sodala, das sollte für den Anfang reichen... wenn's dynamischer werden sollte, würde ich dafür gleich ein MySQL-Backend benutzen :)

PHP:
<?
$kat[0] = "Kategorie 1";
$links[0][] = "Link 1";
$urls[0][] = "http://www.link1.de/";
$links[0][] = "Link 2";
$urls[0][] = "http://www.link2.de/";

$kat[1] = "Kategorie 2";
$links[1][] = "Link 3";
$urls[1][] = "http://www.link3.de/";
$links[1][] = "Link 4";
$urls[1][] = "http://www.link4.de/";
$links[1][] = "Link 5";
$urls[1][] = "http://www.link5.de/";

$kat[2] = "Kategorie 3";
$links[2][] = "Link 6";
$urls[2][] = "http://www.link6.de/";
$links[2][] = "Link 7";
$urls[2][] = "http://www.link7.de/";


$var = $_GET['var'];

for ($i=0; $i<count($kat); $i++) {
	$linkvar = $var ^ (1<<$i);
	echo "<a href=\"?var=".$linkvar."\">";
	if ($var & (1<<$i)) {
		echo "[-] ".$kat[$i]."</a><br>\n";
		for ($nr=0; $nr<count($links[$i]); $nr++) {
			echo "* <a href=\"".$urls[$i][$nr]."\">".$links[$i][$nr]."</a><br>\n";
		}
	} else {
		echo "[+] ".$kat[$i]."<br>\n";
	}
}
?>
 
Hallo Matthias,

ist es auch möglich dieses Menü auf z.B.: 3 Ebenen zu erweitern, ohne dabei in Programmierwahn zu verfallen.?
Oder währe es sinnvoller in diesem Fall neu anzusetzen?

Viele Grüsse
tomate (Detlef)
 
Hmm, die Lösung ist klasse.

Das Problem was ich sehe sind die Anzahl der so erzeugten Einträge, denn in PHP geht nichts über 32 Bit. MySQL selbst kann bis zu 64 Bit, aber die Zahlen werden nur mit max. 32 Bit an PHP übergeben.

3 Ebenen sind sicher etwas komplizierter. Da muss man dann jedes Bit der Eltern einzeln sichern um es immer wieder abfragen zu können (wenn die Kinder durchlaufen werden müssen die gucken, ob Eltern offen sind).

/afterposte/
quark .... man muss erst mal nur die ElternID bei jedem Eintrag speichern.
dann muss man bei jedem Eintrag mit gesetzter ElternID prüfen, ob das Bit der Eltern gesetzt ist. Dürfte also zumindest bei 3 Leveln noch einfach sein
/afterpost/

Hmm....aber das ist ein gutes Beispiel für die Nutzung von Bitfeldern

Ciao, Jörg
 
Zuletzt bearbeitet:
Zurück