Como posso usar referências de matriz dentro de matrizes em PHP?
-
08-07-2019 - |
Pergunta
Eu quero ser capaz de fazer o seguinte:
$normal_array = array();
$array_of_arrayrefs = array( &$normal_array );
// Here I want to access the $normal_array reference **as a reference**,
// but that doesn't work obviously. How to do it?
end( $array_of_arrayrefs )["one"] = 1; // choking on this one
print $normal_array["one"]; // should output 1
Saudações
/ R
Solução
end()
não retorna uma referência do último valor, mas sim o último valor em si. Aqui está uma solução alternativa:
$normal_array = array();
$array_of_arrayrefs = array( &$normal_array );
$refArray = &end_byref( $array_of_arrayrefs );
$refArray["one"] = 1;
print $normal_array["one"]; // should output 1
function &end_byref( &$array ) {
$lastKey = end(array_keys($array));
end($array);
return $array[$lastKey];
}
Outras dicas
Aqui estão algumas das abordagens, nenhum dos quais eu acho particularmente gratificante. Eu tenho certeza que há uma maneira melhor ..
<?php
$normal_array = array();
$array_of_arrayrefs = array( "blah", &$normal_array );
foreach ($array_of_arrayrefs as &$v);
$v["one"] = 1;
echo $normal_array["one"]; //prints 1
?>
<?php
$normal_array = array();
$array_of_arrayrefs = array( "blah", &$normal_array );
$lastIndex = @end(array_keys($array_of_arrayrefs)); //raises E_STRICT because end() expects referable.
$array_of_arrayrefs[$lastIndex]["one"] = 1;
echo $normal_array["one"]; //prints 1
?>
Você provavelmente não deveria estar passando por referência em primeiro lugar. É geralmente considerado uma má prática para fazê-lo, porque torna mais difícil ver onde o estado é modificado.
É um equívoco muito comum que as referências são mais rápidos. Este não é o caso - Na verdade, eles são um pouco mais lento, mas é por uma quantidade tão pequena, que ele realmente não importa. PHP tem um sistema chamado copy-on-write, o que significa que as variáveis ??não são realmente copiados, antes de escrever para eles.
O único lugar onde você realmente precisa de referências, estavam em PHP4, onde os objetos iria ser clonado de outro modo. Isso não é necessário em PHP5.
O fim function () não retornam apenas um valor. Ele também move o ponteiro interno da matriz. Então, podemos usar a tecla () para obter o índice, após o qual somos capazes de usar o acesso à matriz regular para a atribuição.
$normal_array = array();
$array_of_arrayrefs = array( &$normal_array );
end($array_of_arrayrefs);
$array_of_arrayrefs[ key($array_of_arrayrefs) ]["one"] = 1;
print $normal_array["one"];
A linha:
end ($ array_of_arrayrefs) [ "um"] = 1; // asfixia em um presente
lança um erro de análise:
Parse erro: erro de sintaxe, inesperado '[' em /file.php na linha 65
Certifique-se de ter error_reporting
e display_error
ativada.
Eu não tenho certeza do que você quer fazer, mas isso funciona:
$normal_array = array();
$array_of_arrayrefs = array( &$normal_array );
// Here I want to access the $normal_array reference **as a reference**,
// but that doesn't work obviously. How to do it?
$array_of_arrayrefs[0]["one"] = 1;
//end($array_of_arrayrefs )["one"] = 1; // choking on this one
print $normal_array["one"]; // should output 1