Bei der Migration auf PHP 7.4 muss ich mich mit einem anderen Verhalten einiger Array-Funktionen wie reset()
, current()
oder end()
bezüglich ArrayObject auseinandersetzen. Das folgende Beispiel erzeugt verschiedene Ausgaben:
<?php
$array = new \ArrayObject(["a", "b"]);
$item = end($array);
var_dump($item);
$array = ["a", "b"];
$item = end($array);
var_dump($item);
Mit PHP 7.4 ist die Ausgabe:
bool(false)
string(1) "b"
Bei PHP-Versionen vor 7.4 lautet die Ausgabe wie folgt:
string(1) "b"
string(1) "b"
A end($array->getArrayCopy())
erzeugt einen Hinweis, könnte aber eine Problemumgehung sein, wenn es mit einer Variablen verwendet wird.
Gibt es eine Möglichkeit, das Verhalten von end()
mit einem ArrayObject
oder zu emulieren ArrayIterator
? Das ArrayObject könnte sehr groß sein, eine Iteration bis zum Ende ist möglicherweise nicht die beste Lösung.
Lösung des Problems
Sie können das Arrayobjekt zu einem Array machen, um die Schlüssel zu erhalten, und dann end für die Schlüssel verwenden, um den letzten Schlüssel zu erhalten.
$array = new \ArrayObject(["a", "b"]);
$keys = array_keys((array)$array);
$end_key = end($keys);
var_dump($array[$end_key]);
Es ist keine schöne Lösung, aber es funktioniert.
Ich schlage vor, Sie machen es zu einer Funktion, damit Sie es bei Bedarf aufrufen können.
https://3v4l.org/HTGYn
Als eine Funktion:
function end_object($array){
$keys = array_keys((array)$array);
$end_key = end($keys);
return $array[$end_key];
}
$array = new \ArrayObject(["a", "b"]);
$item = end_object($array);
var_dump($item);
Keine Kommentare:
Kommentar veröffentlichen