ArrayObject::exchangeArray

(PHP 5 >= 5.1.0)

ArrayObject::exchangeArrayЗаменяет текущий массив на другой

Описание

public array ArrayObject::exchangeArray ( mixed $input )

Заменяет текущий массив (array) на другой массив (array) или объект (object).

Список параметров

input

Новый массив (array) или объект (object) для замены текущего массива.

Возвращаемые значения

Возвращает старый массив (array).

Примеры

Пример #1 Пример использования ArrayObject::exchangeArray()

<?php
// Массив с количеством фруктов
$fruits = array("lemons" => 1"oranges" => 4"bananas" => 5"apples" => 10);
// Массив мест в Европе
$locations = array('Amsterdam''Paris''London');

$fruitsArrayObject = new ArrayObject($fruits);

// Сейчас заменим фрукты на места
$old $fruitsArrayObject->exchangeArray($locations);
print_r($old);
print_r($fruitsArrayObject);

?>

Результат выполнения данного примера:

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

Коментарии

Автор:
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.
2009-12-15 16:11:24
http://php5.kiev.ua/manual/ru/arrayobject.exchangearray.html
Автор:
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
       
)
)
?>
2014-05-09 17:59:13
http://php5.kiev.ua/manual/ru/arrayobject.exchangearray.html
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)
2021-03-03 01:02:12
http://php5.kiev.ua/manual/ru/arrayobject.exchangearray.html

    Поддержать сайт на родительском проекте КГБ