2012-04-27 19 views
37

¿Hay alguna manera de hacer referencia a una clave de matriz dentro de la matriz? Esto puede tener más sentido en formato de código:PHP: matriz de referencia automática

$array=array(
    "Key1"=>array(
    "Value1", 
    "Value2" 
), 
    "Key2"=>&$this['Key1'] 
); 

Lo que yo quiero es que $array['Key2'] a la salida de la misma que $array['Key1']. I puede agregar $array['Key2']=&$array['Key1']; después de crear la matriz, pero me gustaría mantener todo en un bloque de código si es posible.

He comprobado los documentos en las referencias, así como algunas de las sugerencias de preguntas similares aquí y una búsqueda de "php array reference".

+6

No, no puede. Al crear la matriz, todavía no hay un punto de referencia posible. Entonces, tiene que agregar la referencia después. – mario

+1

+1 para una pregunta interesante :-) –

+1

No hay forma de hacerlo en una sola declaración, a menos que haga referencia a algo que ya existe. Entonces usted podría crear '$ ref = array (" Value1 "," Value2 ");' y luego hacer '$ array = array ('Key1' => & $ ref, 'Key2' => &$ref);' y 'unset ($ ref); 'después - pero no tiene sentido, usted simplemente haría lo que sugirió y creará la referencia después. – DaveRandom

Respuesta

27

La respuesta a esto, como resultado, es Sí. Sin embargo, no es una sintaxis ordenada, ya que utiliza una especie de subdeclaración, y deja el alcance actual lleno de una variable de referencia adicional.

Considere el siguiente código:

<?php 

    $array = array(

    // Creates Key1 and assigns the value to it 
    // A copy of the value is also placed in $ref 
    // At this stage, it's not a reference 
    "Key1"=>($ref = array(
     "Value1", 
     "Value2" 
    )), 

    // Now Key2 is a reference to $ref, but not to Key1 
    "Key2"=>&$ref, 

    // Now everything is referenced together 
    "Key1"=>&$ref 

); 

Me sorprendió que esto funcionó sin errores, pero lo hace - here's the proof. Por supuesto, usted no lo haría haga esto, pero puede ...

+1

+1 Esto funciona porque cuando declara la misma clave dos veces en una matriz, sobrescribe la primera. :-) –

+1

De hecho, este es aparentemente el caso, me pregunté si se quejaría, ya que parece bastante extraño y nunca lo había intentado antes. Obviamente, uno reasigna las claves en una matriz de forma individual, ¡pero rara vez en la declaración de declaración! – DaveRandom

+0

@Starx: elimine los comentarios y el espacio en blanco. Esta es solo una declaración. –

0

Imposible hacerlo en un bloque, porque aún no ha inicializado la variable. Lo mismo con las variables de clase. Para hacer tal cosa, necesitará crear cualquier variable de alguna manera, y solo utilizar sus enlaces, pero está usando memoria, así que una vez más, la respuesta real a su pregunta es - imposible :)

Cuestiones relacionadas