• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • ArrayObject::exchangeArray()

    (PHP 5 >= 5.1.0, PHP 7)

    Exchange the array for another one

    说明

    publicArrayObject::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
        )
    )
    ?>