在迁移到PHP 7.4时,我必须处理一些数组函数的不同行为,如与ArrayObject有关的reset()
、current()
或end()
。以下示例产生不同的输出:
<?php
$array = new ArrayObject(["a", "b"]);
$item = end($array);
var_dump($item);
$array = ["a", "b"];
$item = end($array);
var_dump($item);
使用php 7.4,输出为:
bool(false)
string(1) "b"
在7.4之前的PHP版本上,输出如下:
string(1) "b"
string(1) "b"
end($array->getArrayCopy())
会产生通知,但如果与变量一起使用,则可能是一种变通方法。
有没有办法用ArrayObject
或ArrayIterator
来模仿end()
的行为?ArrayObject可能非常大,迭代到最后可能不是最好的解决方案。
从PHP 7.4开始,数组方法不在内部数组上操作,而是在ArrayObject
本身上操作。我总结了两种解决方案。
1.获取对象的内部数组。
$array = new ArrayObject(["a", "b"]);
$item = end($array->getArrayCopy());
2.创建ArrayObject
的Facade并向升级后的类添加自定义方法end((。
您可以使arrayobject成为一个数组来获取键,然后使用键上的end来获取最后一个键。
$array = new ArrayObject(["a", "b"]);
$keys = array_keys((array)$array);
$end_key = end($keys);
var_dump($array[$end_key]);
这不是一个很好的解决方案,但它是有效的
我建议你把它作为一个函数,这样你就可以在需要的时候调用它。
https://3v4l.org/HTGYn
作为一个函数:
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);
如果不强制转换或使用迭代器,一个稍微快一点的方法是首先不使用构造函数,而是使用append
方法,该方法将自己创建一个数组,稍后可以在该数组上使用end
$array = new ArrayObject();
$array->append(["a", "b"]);
$item = end($array[count($array) - 1]);
var_dump($item);
count($array) - 1
如果以后追加另一个数组,我们会确保$item
始终是最后追加的数组中的最后一个元素。
提出了这种方法。
应该比以上任何一项都表现得更好。
- 不使用内存和CPU强制转换到另一个变量
- 只有一个内部迭代器
- 只有一个新变量,它是对该项的引用
class MyClass extends ArrayObject {
public function last() {
foreach ($this as $entity) {}
return $entity ?? null;
}
}
$array = new MyClass(["a", "b", "c"]);
$item = $array->last();
var_dump($item);