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

Foi útil?

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