GOOGLE ADS

Mittwoch, 20. April 2022

ArrayObject funktioniert nicht mit end() in PHP 7.4

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 ArrayObjectoder 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

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...