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

    (PHP 5, PHP 7)

    Creates a copy of the ArrayObject

    说明

    publicArrayObject::getArrayCopy(void): array

    Exports the ArrayObject to an array.

    参数

    此函数没有参数。

    返回值

    Returns a copy of the array. When the ArrayObject refers to an object, an array of the public properties of that object will be returned.

    范例

    ArrayObject::getArrayCopy() example

    <?php
    // Array of available fruits
    $fruits = array("lemons" => 1, "oranges" => 4, "bananas" => 5, "apples" => 10);
    $fruitsArrayObject = new ArrayObject($fruits);
    $fruitsArrayObject['pears'] = 4;
    // create a copy of the array
    $copy = $fruitsArrayObject->getArrayCopy();
    print_r($copy);
    ?>
    

    以上例程会输出:

    Array
    (
        [lemons] => 1
        [oranges] => 4
        [bananas] => 5
        [apples] => 10
        [pears] => 4
    )
    
    Is there a difference between casting to an array and using this function?
    For instance, if we have:
    $arrayObject = new ArrayObject([1, 2, 3]);
    Is there a difference between these:
    $array = (array) $arrayObject;
    vs
    $array = $arrayObject->getArrayCopy();
    If not, is there any scenario where they would produce different results, or do they produce the result in different ways?
    If you did something like this to make your constructor multidimensional capable you will have some trouble using getArrayCopy to get a plain array straight out of the method:
    <?php
    public function __construct( $array = array(), $flags = 2 )
    {
      // let’s give the objects the right and not the inherited name
      $class = get_class($this);
      foreach($array as $offset => $value)
        $this->offsetSet($offset, is_array($value) ? new $class($value) : $value);
      $this->setFlags($flags); 
    }
    ?>
    That’s the way I solved it:
    <?php
    public function getArray($recursion = false) 
    {
      // just in case the object might be multidimensional
      if ( $this === true)
        return $this->getArrayCopy();
      return array_map( function($item){
        return is_object($item) ? $item->getArray(true) : $item;
      }, $this->getArrayCopy() );
    }
    ?>
    Hope this was useful!
    "When the ArrayObject refers to an object an array of the public properties of that object will be returned."
    This description does not seem to be right:
    <?php
    class A
    {
      public $var = 'var';
      protected $foo = 'foo';
      private $bar = 'bar';
    }
    $o = new ArrayObject(new A());
    var_dump($o->getArrayCopy());
    /*
    Dumps:
    array(3) {
     ["var"]=>
     string(3) "var"
     ["*foo"]=>
     string(3) "foo"
     ["Abar"]=>
     string(3) "bar"
    }
    */
    ?>
    So it does not only include the public properties.
    When I used print_r ($fruitsArrayObject) instead of print_r ($copy), i.e. ignoring the getArrayCopy() step, I still got the same output. Why?
    <?php
    $data = $likeArray->getArrayCopy();
    ?>
    will NOT be magically called if you cast to array. Although I've expected it.
    <?php
    $nothing = (array)$likeArray;
    ?>
    Here, $data != $nothing.