ArrayObject не работает с end () в PHP 7.4 - PullRequest
9 голосов
/ 21 февраля 2020

При переходе на PHP 7.4 мне приходится иметь дело с другим поведением некоторых функций массива, таких как reset(), current() или 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"

Вкл. PHP версии до 7.4. следующее:

string(1) "b"
string(1) "b"

A end($array->getArrayCopy()) создает уведомление, но может использоваться в качестве обходного пути при использовании с переменной.

Есть ли способ эмулировать поведение end() с ArrayObject или ArrayIterator? ArrayObject может быть очень большим, итерация до конца может оказаться не лучшим решением.

Ответы [ 3 ]

2 голосов
/ 09 апреля 2020

С PHP 7.4 методы массива работают не с внутренним массивом, а с самим ArrayObject. Я суммировал два решения для этого.

1. Получение внутреннего массива объекта.

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

2. Создание фасада ArrayObject и добавление пользовательского метода end () в обновленный класс.

0 голосов
/ 22 февраля 2020

Немного более быстрый подход без приведения или использования итератора состоял бы в том, чтобы сначала не использовать конструктор, а вместо этого использовать метод append, который создаст сам массив, и вы можете использовать end для этого массива позже

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

count($array) - 1 в случае, если вы добавите другой массив позже, мы гарантируем, что $item всегда является последним элементом в последнем добавленном массиве.

0 голосов
/ 21 февраля 2020

Вы можете сделать массивобъект массивом для получения ключей, а затем использовать ключ для получения последнего ключа.

$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);
...