Передача копии массива в функцию, ожидающую ссылку - PullRequest
0 голосов
/ 25 октября 2018

У меня есть цикл следующего вида:

foreach ($values as $key => $value) {
    $attrs = array('NAME' => $key);
    myproc ($attrs);
    ......
}

Где в myproc первый параметр определяется ссылкой:

function myproc (& attrs) {  .... }

myproc добавляет переданное значениев какую-то структуру.

Проблема в том, что в конце цикла все массивы, добавленные в сгенерированную структуру, содержат одинаковое значение, последнее значение, извлеченное из цикла.

Я также пыталсякак то так:

foreach ($values as $key => $value) {
    $attrs = array('NAME' => $key);
    $copy = $attrs;
    myproc ($copy);
    ......
}

но результат тот же.Мне не разрешено изменять процедуру.Есть предложения?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Судя по комментарию под вашим вопросом, проблема в том, что вы передаете ссылку, и эта ссылка обновляется в цикле, что приводит к обновлениям объекта, который вы генерируете в своей функции.

Чтобы избежать этого, вам нужно сбросить переменную после вызова функции, чтобы разорвать связь между значением в вашем объекте и указанной переменной:

foreach ($values as $key => $value) {
    $attrs = array('NAME' => $key);
    myproc ($attrs);
    // unset the variable so that newer values of it will have no effect 
    // on the object generated in `myproc`
    unset($attrs);
    ......
}

Также см. руководство .

0 голосов
/ 25 октября 2018
<?php

foreach(['red','pink','green'] as $colour) {
    $attrs = ['colour' => $colour];
    if(colourToAction($attrs)) {
        $results[] = $attrs;
    }
}

var_export($results);

function colourToAction(&$attrs) {
$actions = ['red'=>'stop','amber'=>'wait', 'green' => 'go'];
if(isset($attrs['colour']) && isset($actions[$attrs['colour']])){
    $attrs['action'] = $actions[$attrs['colour']];
    return true;
}
}

Выход:

array (
  0 => 
  array (
    'colour' => 'red',
    'action' => 'stop',
  ),
  1 => 
  array (
    'colour' => 'green',
    'action' => 'go',
  ),
)
...