php копирование элементов массива значением, не ссылкой

Измените своего конструктора к следующему так, чтобы это вызвало конструктора базового класса правильно:

public class MyExceptionClass : Exception
{
    public MyExceptionClass(string message, string extrainfo) : base(message)
    {
        //other stuff here
    }
}

Примечание, что конструктор не что-то, что можно назвать в любое время в рамках метода. Это - причина, Вы получаете ошибки в своем вызове в теле конструктора.

13
задан oym 27 July 2009 в 22:23
поделиться

3 ответа

Вы можете воспользоваться тем фактом, что PHP будет разыменовывать результаты вызова функции.

Вот пример кода, который я придумал:

$x = 'x';
$y = 'y';
$arr = array(&$x,&$y);
print_r($arr);

echo "<br/>";
$arr2 = $arr;
$arr2[0] = 'zzz';
print_r($arr);
print_r($arr2);

echo "<br/>";
$arr2 = array_flip(array_flip($arr));
$arr2[0] = '123';
print_r($arr);
print_r($arr2);

Результаты выглядят так:

Array ( [0] => x [1] => y )
Array ( [0] => zzz [1] => y ) Array ( [0] => zzz [1] => y )
Array ( [0] => zzz [1] => y ) Array ( [0] => 123 [1] => y ) 

Вы можете видеть, что результаты использования array_flip () во время присвоения $ arr $ arr2 приводят к различиям в последующих изменениях в $ arr2 , поскольку вызов array_flip () вызывает разыменование.

Это не кажется очень эффективным, но может сработать для вас, если $ this-> x-> getResults () возвращает массив:

$data['x'] = array_flip(array_flip($this->x->getResults()));
$data['y'] = $data['x'];

См. этот (неотвеченный) поток для другого примера.

Однако если все в вашем возвращенном массиве является объектом, то единственный способ скопировать объект должен использовать clone () ,и вам нужно будет пройти через $ data ['x'] и клонировать каждый элемент в $ data ['y'] .

Пример:

$data['x'] = $this->x->getResults();
$data['y'] = array();
foreach($data['x'] as $key => $obj) {
    $data['y'][$key] = clone $obj;
}
10
ответ дан 1 December 2019 в 22:58
поделиться

Непросто. Читайте про клон

НО! если ваши элементы не объекты и не переменные типа ссылки , у вас нет проблем.

Пример ссылочных типов:

$v=11;
$arr[]=&$v;
3
ответ дан 1 December 2019 в 22:58
поделиться

Если вы работаете с объектами, вы можете взглянуть на clone , чтобы создать копию объекта вместо ссылки .

Вот очень короткий пример:

Во-первых, с массив, он работает по значению:

$data['x'] = array(
    'a' => 'test',
    'b' => 'glop',
);
$data['y'] = $data['x'];
$data['y'][0] = 'Hello, world!';
var_dump($data['x']); // a => test : no problem with arrays

По умолчанию с объектами он работает по ссылке:

$data['x'] = (object)array(
    'a' => 'test',
    'b' => 'glop',
);
$data['y'] = $data['x'];
$data['y']->a = 'Hello, world!';
var_dump($data['x']); // a => Hello, world! : objects are by ref

Но, если вы клонируете объект, вы работаете с копией:
Полагаю, это ваш случай?

$data['x'] = (object)array(
    'a' => 'test',
    'b' => 'glop',
);
$data['y'] = clone $data['x'];
$data['y']->a = 'Hello, world!';
var_dump($data['x']); // a => test : no ref, because of cloning

Надеюсь, это поможет,

2
ответ дан 1 December 2019 в 22:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: