Элементы массива разыменования PHP - PullRequest
6 голосов
/ 02 марта 2010

У меня есть 2 массива.

$result = array();
$row = array();

Все элементы строки являются ссылками и постоянно меняются. Для каждой итерации $row я хочу скопировать значения строки в запись $result, а не в ссылки.

Я нашел несколько решений, но все они кажутся довольно ужасными.

$result[] = unserialize(serialize($row));
$result[] = array_flip(array_flip($row));

Оба вышеперечисленных варианта работают, но кажутся ненужным и уродливым кодом, просто копирующим содержимое массива ссылок по значению, а не копирующим сами ссылки.

Есть ли более чистый способ сделать это? Если нет, то какой будет самый эффективный способ?

Спасибо.

РЕДАКТИРОВАТЬ: Как предлагается ниже что-то вроде:

function dereference($ref) {
    $dref = array();

    foreach ($ref as $key => $value) {
        $dref[$key] = $value;
    }

    return $dref;
}

$result[] = dereference($row);

Также работает, но выглядит так же ужасно.

Ответы [ 2 ]

4 голосов
/ 02 марта 2010

Не уверен, что полностью понимаю вопрос, но вы можете использовать рекурсию?

function array_copy($source) {
    $arr = array();

    foreach ($source as $element) {
        if (is_array($element)) {
            $arr[] = array_copy($element);
        } else {
            $arr[] = $element;
        }
    }

    return $arr;
}

$result = array();
$row = array(
    array('a', 'b', 'c'),
    array('d', 'e', 'f')
);

$result[] = array_copy($row);

$row[0][1] = 'x';

var_dump($result);
var_dump($row);
2 голосов
/ 02 февраля 2012

Расширение указанной выше функции решило проблему, с которой я столкнулся:

function array_copy($source) {
    $arr = array();

    foreach ($source as $element) {
        if (is_array($element)) {
            $arr[] = array_copy($element);
        } elseif (is_object($element)) {
            // make an object copy
            $arr[] = clone $element;
        } else {
            $arr[] = $element;
        }
    }
    return $arr;
}
...