PHP Conference Japan 2024

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)
}

添加注释

用户贡献的注释 5 个注释

4
spidgorny at gmail dot com
7 年前
<?php
$data
= $likeArray->getArrayCopy();
?>
如果将对象强制转换为数组,则不会自动调用该函数。虽然我一开始期望它会自动调用。
<?php
$nothing
= (array)$likeArray;
?>
这里,$data != $nothing。
5
Ivo von Putzer
13 年前
如果你做了类似的事情来使你的构造函数能够处理多维数组,那么在使用 getArrayCopy 从方法中直接获取一个普通数组时,你可能会遇到一些麻烦
<?php
public function __construct( $array = array(), $flags = 2 )
{
// 让对象使用正确的名称,而不是继承的名称
$class = get_class($this);

foreach(
$array as $offset => $value)
$this->offsetSet($offset, is_array($value) ? new $class($value) : $value);

$this->setFlags($flags);
}
?>

这就是我解决它的方法

<?php
public function getArray($recursion = false)
{
// 以防对象可能是多维的
if ( $this === true)
return
$this->getArrayCopy();

return
array_map( function($item){
return
is_object($item) ? $item->getArray(true) : $item;
},
$this->getArrayCopy() );
}
?>

希望这有帮助!
2
jlshor at buffalo dot edu
7 年前
强制转换为数组和使用此函数之间有区别吗?

例如,如果我们有
$arrayObject = new ArrayObject([1, 2, 3]);

以下两种方式之间有区别吗?
$array = (array) $arrayObject;

$array = $arrayObject->getArrayCopy();

如果没有,那么在什么情况下它们会产生不同的结果,或者它们以不同的方式产生结果?
1
php at webflips dot net
10 年前
"当 ArrayObject 引用一个对象时,将返回该对象公有属性的数组。"

此描述似乎不正确

<?php
class A
{
public
$var = 'var';
protected
$foo = 'foo';
private
$bar = 'bar';
}

$o = new ArrayObject(new A());
var_dump($o->getArrayCopy());

/*
输出:

array(3) {
["var"]=>
string(3) "var"
["*foo"]=>
string(3) "foo"
["Abar"]=>
string(3) "bar"
}
*/
?>

所以它不仅包含公有属性。
0
sorcerer
7 年前
当我使用 print_r ($fruitsArrayObject) 而不是 print_r ($copy),即忽略 getArrayCopy() 步骤时,我仍然得到了相同的输出。为什么?
To Top