Elementos de matriz de dereferência PHP
-
23-09-2019 - |
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.
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;
}