Umstellung auf PHP 8: Ersetzung von each

Dragosius

Erfahrenes Mitglied
Hallo,
ich versuche gerade ein Projekt auf PHP 8 umzustellen.
Dort muss ich nun an einigen Stellen die Funktion each ersetzen, da dies ja mit PHP 8 ersetzt wurde.

Irgendwie hänge ich da leider gerade etwas an der Umstellung.

Ich habe dort z.B. folgende Abfragen im Einsatz:
PHP:
while (($i < 3) && list($datum, $nick) = each($nick_historie)) {
    $nick_historie_neu[$datum] = $nick;
    $i++;
}

PHP:
while (list($datum, $ip_adr) = each($ip_historie)) {
    $value .= "<br>" . $ip_adr . "&nbsp;(" . str_replace(" ", "&nbsp;", date("d.m.y H:i", $datum)) . ")";
}

PHP:
list($key, $value) = each($nick_historie);
$differenz = time() - $key;

Vielen dank schon Mal.
 
ja das ist der alte Code und dort ist überall ein each enthalten und meine Frage war, wie ich das am Besten ersetzen kann.
 
Ah, jetzt sehe ich den each.
Nimm foreach wie m.scatello vorgeschlagen hat.
PHP:
$i = 0;
foreach($nick_historie as $datum => $nick){
    if($i < 3) break;
    $nick_historie_neu[$datum] = $nick;
    $i++;
}
 
Ah, jetzt sehe ich den each.
Nimm foreach wie m.scatello vorgeschlagen hat.
PHP:
$i = 0;
foreach($nick_historie as $datum => $nick){
    if($i < 3) break;
    $nick_historie_neu[$datum] = $nick;
    $i++;
}
Danke, das hbae ich dann nach meiner Antwort hin bekommen. :)

Jetzt habe ich leider noch 3 Fälle, die für mich ein Rätsel sind:
PHP:
list($key, $value) = each($nick_historie);
Was bedeutet das ohen Schleife?
Es wird der erste Wert genommen?

Die beiden folgenden Code-Stellen kapiere ich leider nicht:
PHP:
for (@reset($sp_list); (list(, $sp_text) = each($sp_list))
    AND (!preg_match("/" . $sp_such . "/i", $sp_text));)
    ;

PHP:
for (@reset($sp_list); list(, $sp_text) = each($sp_list);) {
    if (preg_match( "/^" . preg_quote($spruchname, "/") . "\t/i", $sp_text)) {
        $spruchtmp = preg_split("/\t/", $sp_text, 3);
        $txt = "<small><b>$lang[chat_spruch4] <i>" . $spruchtmp[0] . " " . $spruchtmp[1] . "</i></b> &lt;" . $spruchtmp[2] . "&gt;</small>";
        system_msg("", 0, $u_id, $system_farbe, $txt);
    }
}
 
Ungewohnte Schreibweise. Ich kenne es nicht, dass man innerhalb einer () verschiedene Befehle hat.
reset setzt glaub den Zeiger im Array wieder au den Anfang. preag_match testet auf ein Regulären Ausdruck (Suchmaske). Der müsste in $sp_such hinterlegt sein. Aber eigentlich macht es nix ausser den Zeiger zurücksetzen.
PHP:
//anders formatiert, für mich besser lesbar
for (
    @reset($sp_list); 
    (list(, $sp_text) = each($sp_list)) AND (!preg_match("/" . $sp_such . "/i", $sp_text));
);

Den reset braucht man bei foreach nicht. Den 2ten Code lässt sich einfach umschreiben
PHP:
foreach($sp_list as $sp_text){
   if (preg_match( "/^" . preg_quote($spruchname, "/") . "\t/i", $sp_text)) {
        $spruchtmp = preg_split("/\t/", $sp_text, 3);
        $txt = "<small><b>$lang[chat_spruch4] <i>" . $spruchtmp[0] . " " . $spruchtmp[1] . "</i></b> &lt;" . $spruchtmp[2] . "&gt;</small>";
        system_msg("", 0, $u_id, $system_farbe, $txt);
    }
}
 
Danke für die Rückmeldung.

Nur leider werde ich aus dem 1. Code, den du umgeschri9eben hast, leider immer noch nicht schlau.
Das kann man ebenfalls in einer foreach-Schleife abbilden, das habe ich verstanden, nur was befindet sich denn da innerhalb der Schleife?
 
Es wird die Liste durchgegangen. Am Schluss ist in der Varibale $sp_text der letzte Eintrag der Liste, bei dem der preg_match nicht zutrifft
PHP:
foreach($sp_text_tmp as $sp_list){
    if(!preg_match("/" . $sp_such . "/i", $sp_text_tmp){
        $sp_text = $sp_text_tmp;
    }
}
 

Neue Beiträge

Zurück