Zeiger in Array auf bestimmten Schlüssel setzen
-Tom-
- php
Hi,
1. ich habe auf php.net geschaut und nichts gefunden!
Ich habe ein assoziatives Array und möchte den Schlüssel vor und nach einem bestimmten Schlüssel haben. Ich muss also irgendwie meinen Schlüssel finden um dann den Schlüssel davor und danach zu bekommen. Wie mache ich das?
Ich müsste irgendwie durchzählen und bei meinem Schlüssel stoppen, dann könnte ich mit next() bzw. prev() auf die anderen Schlüssel zugreifen.
Ich dachte, dass das komfortabel mit einer foreach-Schleife geht. Wenn der jew. Schlüssel meinem gesuchten String entspricht stoppe ich, besetze zwei Variablen mit next() und prev(). Aber prev() / next() innerhalb meiner Schleife zu vergeben klappt nicht.
Und außerhalb klappt es nur, solange der gesuchte Schlüssel nicht der erste oder letzte ist:
<?php
$seite = "seite2"; #bei seite1 oder seite3 geht es nicht
$seiten = array("seite1" => "Seite 1", "seite2" => "Seite 2", "seite3" => "Seite 3");
foreach($seiten as $s => $title)
{
if($s == $seite) break;
}
$weiter = current($seiten);
$zurueck = prev($seiten);
$zurueck = prev($seiten);
?>
(Überhaupt verstehe ich nicht so recht, was mir current/next/prev bringen, wenn ich so oder so beim ersten Element anfangen muss).
Da es wohl nicht einfach geht - wie gehts schwierig?
So klappts, ist aber ein ganz klein wenig umständlich:
<?php
$seiten = array("seite1" => "Seite 1", "seite2" => "Seite 2", "seite3" => "Seite 3");
$s0 = each($seiten); #erzeuge für jedes Schlüssel-Wertepaar
$s1 = each($seiten); #ein eigenes Array
$s2 = each($seiten);
$anz = count($seiten); #Anzahl S-W-Paare im Array
for($i=0; $i < $anz; $i++) #Ermitteln welches Array meinem
{ #gesuchten Schlüssel entspricht
$s = "s".$i;
$s = $$s;
if($thema == $s[0])
{
$j = $i;
}
}
if($j != ($anz - 1)) #Variablen für Weiter-Link
{ #und -titel erzeugen
$weiter = $j + 1;
$weiter = "s".$weiter;
$weiter = $$weiter;
$weitertitle = $weiter;
$weiter = $weiter[0];
$weitertitle = $weitertitle[1];
}
else #War aktuelle Seite die erste,
{ #setzte Link zum Index
$weiter = "index";
$weitertitle = "Index";
}
if($j != 0) #Variablen für Zurück-Link
{ #und -titel erzeugen
$zurueck = $j - 1;
$zurueck = "s".$zurueck;
$zurueck = $$zurueck;
$zuruecktitle = $zurueck;
$zurueck = $zurueck[0];
$zuruecktitle = $zuruecktitle[1];
}
else #War aktuelle Seite die erste,
{ #setzte Link zum Index
$zurueck = "index";
$zuruecktitle = "Index";
}
?>
echo $begrüßung;
Ich habe ein assoziatives Array und möchte den Schlüssel vor und nach einem bestimmten Schlüssel haben. Ich muss also irgendwie meinen Schlüssel finden um dann den Schlüssel davor und danach zu bekommen. Wie mache ich das?
Wenn du "mein" als das Feld definierst, dessen Wert du kennst: array_search() findet das erste Vorkommen eines Wertes und liefert den dazugehörigen Schlüssel. Nun brauchst du eine Liste der Schlüssel mit Positionsangaben, damit du Position -1 und +1 ermitteln kannst. Die kann die Funktion array_keys() liefern, da sie eine durchnummerierte Liste der Schlüssel zurückgibt.
Werte können in einem Array auch mal mehrfach vorkommen. Dann funktioniert die Suche nach dem Wert nur noch eingeschränkt, bzw. liefert kein einzelnes Ergebnis mehr. Es ist von Vorteil, wenn du vom eindeutigen Key ausgehen kannst.
(Überhaupt verstehe ich nicht so recht, was mir current/next/prev bringen, wenn ich so oder so beim ersten Element anfangen muss).
Diese Funktionen stammen aus alten PHP-Zeiten als es noch kein foreach gab. Da hatten sie zusammen mit each() ihre Daseinsberechtigung, um sich durch Arrays zu bewegen. Seit foreach brauche ich sie so gut wie gar nicht mehr.
echo "$verabschiedung $name";
Hi,
ich kenne leider den Schlüssel, nicht den Wert. Aber, da fällts mir quasi wie Schppen aus den Haaren, dann komm ich ja mit array_keys relativ elegant weiter - auch ohne zusätzliche Liste:
<?php
$aktuell = "seite2";
$seiten = array("seite1" => "Seite 1", "seite2" => "Seite 2", "seite3" => "Seite 3");
$i = '0';
foreach($seiten as $seite => $titel)
{
if($seite == $aktuell) break;
$i++;
}
$key = array_keys($seiten);
$zurueck = $key[$i-1];
$weiter = $key[$i+1];
$zuruecktitel = $seiten[$zurueck];
$weitertitel = $seiten[$weiter];
(... irgendeine if-Abfrage falls erste/letzte Seite)
?>
Vielen Dank.