ArrayObject::exchangeArray()
(PHP 5 >= 5.1.0, PHP 7)
Exchange the array for another one
说明
public ArrayObject::exchangeArray(mixed $input): array
Exchange the current array with another array or object.
参数
- $input
The new array or object to exchange with the current array.
返回值
Returns the old array.
范例
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); ?>
以上例程会输出:
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.
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 ) ) ?>