9

在迁移到 PHP 7.4 时,我必须处理一些数组函数的不同行为,例如reset()ArrayObjectcurrent()end()有关 ArrayObject。以下示例产生不同的输出:

<?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"

Aend($array->getArrayCopy())会产生通知,但如果与变量一起使用,则可能是一种解决方法。

有没有办法模仿orend()的行为?ArrayObject 可能非常大,迭代到最后可能不是最佳解决方案。ArrayObjectArrayIterator

4

3 回答 3

2

PHP 7.4开始,数组方法不再作用于内部数组,而是作用于ArrayObject自身。为此,我总结了两种解决方案。

1.获取对象的内部数组。

$array = new \ArrayObject(["a", "b"]);
$item = end($array->getArrayCopy());

2.创建 Facade ofArrayObject并将自定义方法 end() 添加到升级的类。

于 2020-04-09T16:02:48.813 回答
0

您可以使 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);
于 2020-02-21T13:13:34.363 回答
0

不强制转换或使用迭代器的稍微快一点的方法是首先不使用构造函数,而是使用append将创建一个数组本身的方法,您可以end稍后在该数组上使用

$array = new \ArrayObject();
$array->append(["a", "b"]);
$item =  end($array[count($array) - 1]);
var_dump($item);

count($array) - 1如果您稍后附加另一个数组,我们确保它$item始终是最后一个附加数组中的最后一个元素。

于 2020-02-21T22:45:56.077 回答