PHP 8.5.0 Beta 3 available for testing

ArrayObject::getArrayCopy

(PHP 5, PHP 7, PHP 8)

ArrayObject::getArrayCopy โ€” ArrayObject ใฎใ‚ณใƒ”ใƒผใ‚’ไฝœๆˆใ™ใ‚‹

่ชฌๆ˜Ž

public ArrayObject::getArrayCopy(): array

ArrayObject ใ‚’้…ๅˆ—ใซใ‚จใ‚ฏใ‚นใƒใƒผใƒˆใ—ใพใ™ใ€‚

ใƒ‘ใƒฉใƒกใƒผใ‚ฟ

ใ“ใฎ้–ขๆ•ฐใซใฏใƒ‘ใƒฉใƒกใƒผใ‚ฟใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚

ๆˆปใ‚Šๅ€ค

้…ๅˆ—ใฎใ‚ณใƒ”ใƒผใ‚’่ฟ”ใ—ใพใ™ใ€‚ArrayObject ใŒใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใ‚’ๅ‚็…งใ—ใฆใ„ใ‚‹ๅ ดๅˆใฏใ€ ใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใฎใƒ—ใƒญใƒ‘ใƒ†ใ‚ฃใฎ้…ๅˆ—ใ‚’่ฟ”ใ—ใพใ™ใ€‚

ไพ‹

ไพ‹1 ArrayObject::getArrayCopy() ใฎไพ‹

<?php
// ใƒ•ใƒซใƒผใƒ„ใฎ้…ๅˆ—
$fruits = array("lemons" => 1, "oranges" => 4, "bananas" => 5, "apples" => 10);

$fruitsArrayObject = new ArrayObject($fruits);
$fruitsArrayObject['pears'] = 4;

// ้…ๅˆ—ใฎใ‚ณใƒ”ใƒผใ‚’ไฝœๆˆใ—ใพใ™
$copy = $fruitsArrayObject->getArrayCopy();
var_dump($copy);

?>

ไธŠใฎไพ‹ใฎๅ‡บๅŠ›ใฏไปฅไธ‹ใจใชใ‚Šใพใ™ใ€‚

array(5) {
  ["lemons"]=>
  int(1)
  ["oranges"]=>
  int(4)
  ["bananas"]=>
  int(5)
  ["apples"]=>
  int(10)
  ["pears"]=>
  int(4)
}

๏ผ‹add a note

User Contributed Notes 5 notes

up
4
spidgorny at gmail dot com ยถ
8 years ago
<?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.
up
5
Ivo von Putzer ยถ
13 years ago
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!
up
2
jlshor at buffalo dot edu ยถ
8 years ago
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?
up
1
php at webflips dot net ยถ
11 years ago
"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.
up
0
sorcerer ยถ
8 years ago
When I used print_r ($fruitsArrayObject) instead of print_r ($copy), i.e. ignoring the getArrayCopy() step, I still got the same output. Why?
To Top