PHP Conference Japan 2024

ArrayObject::getArrayCopy

(PHP 5, PHP 7, PHP 8)

ArrayObject::getArrayCopy建立 ArrayObject 的副本

說明

public ArrayObject::getArrayCopy(): 陣列

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 則註釋

spidgorny at gmail dot com
7 年前
<?php
$data
= $likeArray->getArrayCopy();
?>
如果您將其轉換為陣列,則不會神奇地被呼叫。雖然我曾期望它會。
<?php
$nothing
= (array)$likeArray;
?>
這裡,$data != $nothing。
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() );
}
?>

希望這有幫助!
jlshor at buffalo dot edu
7 年前
將物件強制轉換為陣列和使用這個函式之間有什麼區別嗎?

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

這兩種方法之間有什麼區別
$array = (array) $arrayObject;
vs
$array = $arrayObject->getArrayCopy();

如果沒有,是否有任何情況下它們會產生不同的結果,或者它們是否以不同的方式產生結果?
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"
}
*/
?>

所以它不僅包含公開屬性。
sorcerer
7 年前
當我使用 `print_r ($fruitsArrayObject)` 而不是 `print_r ($copy)` 時,也就是說忽略了 `getArrayCopy()` 這個步驟,我仍然得到相同的輸出。這是為什麼呢?
To Top