$配列はすべての要素が参照である配列です。参照のPHP配列の詳細コピー
この配列を$ results(ループ内)と呼ばれる別の配列に追加したいのですが、参照であるので、PHPは参照をコピーし、$結果は同じ要素でいっぱいです。
これまでのところ、最高の実用的なソリューションは、次のとおりです。私は非常に非効率的であることを恐れる
$results[] = unserialize(serialize($array));
。これを行うより良い方法はありますか?
$配列はすべての要素が参照である配列です。参照のPHP配列の詳細コピー
この配列を$ results(ループ内)と呼ばれる別の配列に追加したいのですが、参照であるので、PHPは参照をコピーし、$結果は同じ要素でいっぱいです。
これまでのところ、最高の実用的なソリューションは、次のとおりです。私は非常に非効率的であることを恐れる
$results[] = unserialize(serialize($array));
。これを行うより良い方法はありますか?
$array_by_assignment
は($array_by_assignment[0][0] == 'bar'
)
$original = 'foo';
$array_of_reference = array(&$original);
function myclone($value)
{
return $value;
}
$array_by_myclone = array();
$array_by_myclone[] = array_map('myclone', $array_of_reference);
$array_by_assignment = array();
$array_by_assignment[] = $array_of_reference;
$original = 'bar';
var_dump($array_by_myclone[0][0]); // foo, values were cloned
var_dump($array_by_assignment[0][0]); // bar, still a reference
EDITクローン化された値を持つことになりますしながら、あなたがここに$array_by_myclone
はまだ$original
($array_by_myclone[0][0] == 'foo'
)への参照を持っています機能のデリファレンスの結果はexempleために、戻っているという事実を使用することができます。私は、 unserialize(serialize())
が速かったというコメントが正しいかどうかを確認したいので、私はPHP 5.5を使ってテストを行いました。これは間違っていることが判明しました。シリアル化メソッドを使用すると、小さなデータセットでも処理が遅くなり、取得。使用
[email protected]:~$ php -v
PHP 5.5.1-1~dotdeb.1 (cli) (built: Aug 3 2013 22:19:30)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies
with Zend OPcache v7.0.2-dev, Copyright (c) 1999-2013, by Zend Technologies
[email protected]:~$ php reference.php 1
myclone: 0.000010 seconds
serialize: 0.000012 seconds
[email protected]:~$ php reference.php 1000000
myclone: 0.398540 seconds
serialize: 0.706631 seconds
コード:
<?php
$iterations = 1000000;
if (isset($argv[1]) && is_numeric($argv[1])) {
$iterations = max(1, (int)$argv[1]);
}
$items = array();
for ($i = 0; $i < $iterations; $i++) {
$items[] = 'item number '.$i;
}
$array_of_refs = array();
foreach ($items as $k => $v) {
$array_of_refs[] = &$items[$k];
}
function myclone($value)
{
return $value;
}
$start = microtime(true);
$copy = array_map('myclone', $array_of_refs);
$time = microtime(true) - $start;
printf("%-10s %2.6f seconds\n", 'myclone:', $time);
$start = microtime(true);
$copy = unserialize(serialize($array_of_refs));
$time = microtime(true) - $start;
printf("%-10s %2.6f seconds\n", 'serialize:', $time);
シリアル化の原因にarray_mapとarray_mapを比較する必要はありませんが、有用ではありません。
$original = array('key'=>'foo');
$array_of_reference = array(&$original);
function myclone($value)
{
return $value;
}
$array_by_myclone = array();
$array_by_myclone[] = array_map('myclone', $array_of_reference);
$array_by_assignment = array();
$array_by_assignment[] = $array_of_reference;
$original['key'] = 'bar';
var_dump($array_by_myclone[0][0]['key']); // bar, still a reference
var_dump($array_by_assignment[0][0]['key']); // bar, still a reference
array_map foreachのように、指定された配列の要素にコールバックを適用します。コピーする配列に1つ以上のネストがある場合、array_mapは機能しません。
@leonbloy私は同意します。 – Chad