ArrayObject::exchangeArray

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

ArrayObject::exchangeArrayExchange the array for another one

Description

public ArrayObject::exchangeArray(array|object $array): array

Exchange the current array with another array or object.

Parameters

array

The new array or object to exchange with the current array.

Return Values

Returns the old array.

Examples

Example #1 ArrayObject::exchangeArray() example

<?php
// Array of available fruits
$fruits = array("lemons" => 1, "oranges" => 4, "bananas" => 5, "apples" => 10);
// Array of locations in Europe
$locations = array('Amsterdam', 'Paris', 'London');

$fruitsArrayObject = new ArrayObject($fruits);

// Now exchange fruits for locations
$old = $fruitsArrayObject->exchangeArray($locations);
print_r($old);
print_r($fruitsArrayObject);

?>

The above example will output:

Array
(
    [lemons] => 1
    [oranges] => 4
    [bananas] => 5
    [apples] => 10
)
ArrayObject Object
(
    [0] => Amsterdam
    [1] => Paris
    [2] => London
)

add a note add a note

User Contributed Notes 3 notes

up
4
Corentin Larose
10 years ago
It's worth notting that ArrayObject::exchangeArray() doesn't call ArrayObject::offsetSet() internally for each offset/property of the array/object provided in argument.

It's also worth noting the let's say "unexpected" behavior of get/set:

<?php
class MyArrayObject extends ArrayObject
{
    public function
offsetSet($name, $value)
    {
       
parent::offsetSet($name . '_control', $value);
       
parent::offsetSet($name, $value);
    }
}

$test = new MyArrayObject();
$test->setFlags(\ArrayObject::ARRAY_AS_PROPS);
$test['my_value_1'] = 1;
$test['my_value_1'] = $test['my_value_1'] + 1;
$test['my_value_1'] += 1;
$test['my_value_1'] ++;
++
$test['my_value_1'];

$test->my_value_2 = 1;
$test->my_value_2 = $test->my_value_2 + 1;
$test->my_value_2 += 1;
$test->my_value_2 ++;
++
$test->my_value_2;

print_r($test);

// Prints out:
MyArrayObject Object
(
    [
storage:ArrayObject:private] => Array
        (
            [
my_value_1_control] => 3
           
[my_value_1] => 5
           
[my_value_2_control] => 2
           
[my_value_2] => 5
       
)
)
?>
up
6
Dmitri Snytkine
14 years ago
It seems that input array is always passed by reference.
For example if you have an existing array
$array with some values
then you have an arrayobject $o
and then you do this:
$o->exchangeArray($array);
$o->offsetSet('somekey', 'some value');

Now if you check your $array array, it will have
a key 'somekey' with value of 'some value'

I totally did not expect that, I am sure it was a mistake to pass array by reference by default.
up
0
ievgen dot varava at spryker dot com
3 years ago
Looks like PHP8 brings undocumented change to this method signature. Example:

<?php
interface intA {
    public function
exchangeArray($param);
}

class
classB extends ArrayObject implements intA {}
?>

PHP 7.4.13: no errors

PHP 8.0.0: Fatal error:  Declaration of ArrayObject::exchangeArray(object|array $array) must be compatible with intA::exchangeArray($param)
To Top