Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ArrayObject does not work with end() in PHP 7.4

Tags:

php

php-7.4

On migrating to PHP 7.4 I have to deal with a different behavior of some array functions like reset(), current() or end() concerning ArrayObject. The following example produces different outputs:

<?php

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


$array = ["a", "b"];
$item = end($array);
var_dump($item);

With php 7.4 the output is:

bool(false)
string(1) "b"

On PHP versions before 7.4 the output is the following:

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

A end($array->getArrayCopy()) produces a notice, but might be a workaround if used with a variable.

Is there a way to emulate the behavior of end() with an ArrayObject or ArrayIterator? The ArrayObject could be very big, an iteration to the end might not be the best solution.

like image 637
Trendfischer Avatar asked Feb 21 '20 12:02

Trendfischer


Video Answer


2 Answers

From PHP 7.4 array methods don't operate on internal array, but on ArrayObject itself. I summarized two solutions for that.

1. Getting internal array of object.

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

2. Creating Facade of ArrayObject and adding custom method end() to upgraded class.

like image 159
Jsowa Avatar answered Sep 28 '22 01:09

Jsowa


You can make the arrayobject an array to get the keys then use end on the keys to get the last key.

$array = new \ArrayObject(["a", "b"]);
$keys = array_keys((array)$array);
$end_key = end($keys);

var_dump($array[$end_key]);

It's not a pretty solution but it works.
I suggest you make it a function so that you can call it when needed.

https://3v4l.org/HTGYn

As a function:

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);
like image 36
Andreas Avatar answered Sep 28 '22 01:09

Andreas