Domanda

Voglio essere in grado di fare quanto segue:

$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

Saluti

/ R

È stato utile?

Soluzione

end () non restituisce un riferimento all'ultimo valore, ma piuttosto all'ultimo valore stesso. Ecco una soluzione 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];
}

Altri suggerimenti

Ecco un paio di approcci, nessuno dei quali trovo particolarmente soddisfacente. Sono sicuro che c'è un modo migliore ..

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

Probabilmente non dovresti passare per riferimento in primo luogo. In genere è considerato una cattiva pratica farlo, perché rende difficile vedere dove lo stato viene modificato.

È un'idea sbagliata molto comune che i riferimenti siano più veloci. Questo non è il caso - In realtà, sono un po 'più lenti, ma è così piccolo che non importa davvero. PHP ha un sistema chiamato copy-on-write, il che significa che le variabili non sono effettivamente copiate, prima di scriverle.

L'unico posto in cui hai davvero bisogno di riferimenti, erano in PHP4, dove gli oggetti sarebbero stati clonati altrimenti. Questo non è necessario in PHP5.

La funzione end () non restituisce solo un valore. Sposta anche il puntatore interno dell'array. Quindi possiamo usare key () per ottenere l'indice, dopo di che siamo in grado di usare un normale accesso alla matrice per l'assegnazione.

$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 linea:

  

end ($ array_of_arrayrefs) [" one "] = 1; // soffocando su questo

genera un errore di analisi:

  

Errore di analisi: errore di sintassi, imprevisto '[' in /file.php sulla riga 65

Assicurati di aver error_reporting e display_error attivati.

Non sono sicuro di cosa tu voglia fare ma questo funziona:

$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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top