Pergunta

Eu tenho 2 matrizes.

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

Os elementos de Row são todas as referências e estão constantemente mudando. Para cada iteração de $row Eu quero copiar o valores de linha em uma entrada de $result e não as referências.

Eu encontrei algumas soluções, mas todas parecem terríveis.

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

Ambos funcionam acima, mas parecem muito código desnecessário e feio apenas para copiar o conteúdo de uma matriz de referências por valor, em vez de copiar as próprias referências.

Existe uma maneira mais limpa de fazer isso? Se não, qual seria a maneira mais eficiente?

Obrigado.

EDITAR: Como sugerido abaixo, algo como:

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

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

    return $dref;
}

$result[] = dereference($row);

Também funciona, mas parece igualmente feio.

Foi útil?

Solução

Não tenho certeza se eu entendo totalmente a pergunta, mas você pode usar a recursão?

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);

Outras dicas

Estendendo a função acima, como segue, resolveu um problema que eu tive:

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top