Question

Je veux pouvoir effectuer les opérations suivantes:

$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

Cordialement

/ R

Était-ce utile?

La solution

end () ne renvoie pas une référence de la dernière valeur, mais plutôt la dernière valeur elle-même. Voici une solution de contournement:

$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];
}

Autres conseils

Voici quelques approches, que je ne trouve pas particulièrement satisfaisantes. Je suis sûr qu'il existe un meilleur moyen.

<?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
?>

Vous ne devriez probablement pas passer par référence en premier lieu. C'est généralement considéré comme une mauvaise pratique de le faire, car il est difficile de voir où l'état est modifié.

C'est une idée fausse très commune selon laquelle les références sont plus rapides. Ce n'est pas le cas - en fait, ils sont un peu plus lents, mais c'est tellement peu, que ça n'a pas d'importance. PHP a un système appelé copie sur écriture, ce qui signifie que les variables ne sont pas réellement copiées avant que vous ne leur écriviez.

Le seul endroit où vous avez vraiment besoin de références est en PHP4, où les objets seraient clonés autrement. Ce n'est pas nécessaire en PHP5.

La fonction end () ne renvoie pas seulement une valeur. Il déplace également le pointeur interne du tableau. Ensuite, nous pouvons utiliser key () pour obtenir l'index, après quoi nous pourrons utiliser un accès normal à un tableau pour l'affectation.

$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"];

La ligne:

  

end ($ array_of_arrayrefs) [" un "]] = 1; // étouffement sur celui-ci

génère une erreur d'analyse:

  

Erreur d'analyse: erreur de syntaxe, '[' inattendu dans le fichier / fichier.php à la ligne 65

Assurez-vous que les options rapport_erreur et display_error sont activées.

Je ne suis pas sûr de ce que vous voulez faire, mais cela fonctionne:

$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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top