Foros del Web » Programando para Internet » PHP »

pasar array por referencia

Estas en el tema de pasar array por referencia en el foro de PHP en Foros del Web. Hola, he estado probando pero no consigo hacer lo siguiente: una función a la que se le pasan dos parametros, los dos por referencia. El ...
  #1 (permalink)  
Antiguo 03/10/2010, 15:35
 
Fecha de Ingreso: diciembre-2009
Mensajes: 186
Antigüedad: 14 años, 4 meses
Puntos: 5
pasar array por referencia

Hola,

he estado probando pero no consigo hacer lo siguiente:
una función a la que se le pasan dos parametros, los dos por referencia. El primero es un array y el segundo una variable que devuelve un valor.
El valor devuelto por la segunda variable es una referencia a un elemento del array del primer paramtro.
Para después cambiar el valor de la segunda variable y que cambie también el elemento del array.

Lo que yo he intentado es esto:

Código:
$g=array(1,2,3,4);
$this->prueba($g,$p);
$p=10;

function prueba(&$arr,&$var)
{
    $var=&$arr[1];
}
Al cambiar el valor de $var debería cambiar también el valor de $g[1] de 2 a 10 o por lo menos eso es lo que quiero.

Gracias por responder
  #2 (permalink)  
Antiguo 03/10/2010, 17:14
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: pasar array por referencia

Cita:
Iniciado por DarkWater Ver Mensaje
Hola,

he estado probando pero no consigo hacer lo siguiente:
una función a la que se le pasan dos parametros, los dos por referencia. El primero es un array y el segundo una variable que devuelve un valor.
El valor devuelto por la segunda variable es una referencia a un elemento del array del primer paramtro.
Para después cambiar el valor de la segunda variable y que cambie también el elemento del array.

Lo que yo he intentado es esto:

Código:
$g=array(1,2,3,4);
$this->prueba($g,$p);
$p=10;

function prueba(&$arr,&$var)
{
    $var=&$arr[1];
}
Al cambiar el valor de $var debería cambiar también el valor de $g[1] de 2 a 10 o por lo menos eso es lo que quiero.

Gracias por responder
Debes ser algo así
Código PHP:
Ver original
  1. <?php
  2. function prueba(&$arr,$var){
  3.     $arr[1] = $var;
  4. }
  5. $g = array(1,2,3,4);
  6. $p = 10;
  7. prueba($g,$p);
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 03/10/2010, 23:53
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: pasar array por referencia

Hola
adicional a lo que ya te comentaron, fijate que $p va antes del llamado a la función, si no se hace de ese modo el elemento del array pasaría de ser 2 a ser NULL

ahora, si además de convertir el array, quieres que $p obtenga el valor anterior del array, podrías tener esto

Código php:
Ver original
  1. $g=array(1,2,3,4);
  2. $p=10;
  3. prueba($g,$p);
  4.  
  5.  
  6. function prueba(&$arr,&$var)
  7. {
  8.     $tmp = $arr[1];
  9.     $arr[1] = $var;
  10.     $var = $tmp;
  11. }
  12.  
  13. echo $p;

y si luego piensas en que sería mejor que la posición del array fuese dinámica, pues agregar otro parámetro a la función que sea la posición a modificar del array

saludos
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #4 (permalink)  
Antiguo 04/10/2010, 03:13
 
Fecha de Ingreso: diciembre-2009
Mensajes: 186
Antigüedad: 14 años, 4 meses
Puntos: 5
Respuesta: pasar array por referencia

Hola,

primero gracias por responder.

Pero no es exactamente eso lo que quería. Tengo un array que contiene otros arrays y estos arrays otros, entonces lo que hago es pasarle ese array a la función. La función realiza un proceso de busqueda, y lo que quiero es que en el segundo parametro pasado me devuelva como si dijeramos un puntero al subarray buscado por la función, para luego yo poder modificar ese array fuera de la función.

La función es una función de busqueda en un array de arrays
  #5 (permalink)  
Antiguo 04/10/2010, 03:31
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: pasar array por referencia

Cita:
Iniciado por DarkWater Ver Mensaje
Hola,

primero gracias por responder.

Pero no es exactamente eso lo que quería. Tengo un array que contiene otros arrays y estos arrays otros, entonces lo que hago es pasarle ese array a la función. La función realiza un proceso de busqueda, y lo que quiero es que en el segundo parametro pasado me devuelva como si dijeramos un puntero al subarray buscado por la función, para luego yo poder modificar ese array fuera de la función.

La función es una función de busqueda en un array de arrays
ehm... algo enredado, a ver, puedo con eso entender dos cosas

0. se quiere una función que, pasandole un array y un valor a buscar, me informe en CUAL posición esta el VALOR a buscar
1. se quiere una función que, pasandole un array y un valor a buscar, me
informe CUAL es el VALOR de una posición en específico
2. se quiere una función que, pasandole un array y un valor a buscar, me reemplaze el VALOR de una posición en específico (descartado pue este sería el post inicial)

cual de estas dos posibles para mi es lo que necesitas??
o no está aquí tampoco?? es algo más??
pues hablas de un "puntero" a un subarray, a mi me suena a la opción 0
pero puedo estar equivocado

sin embargo, las opciones que ya te fueron publicadas cumplen con el post inicial, razón por la cual te sugiero para una próxima ocasión seas bastante específico en lo que tienes, y en lo que en realidad necesitas, pues si no lo
haces así, luego estaremos de nuevo en esta encrucijada de replantearnos
el asunto (solo a modo de observación)

así el asunto, espero a que respondas para ver cual es la necesidad
saludos
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #6 (permalink)  
Antiguo 04/10/2010, 04:07
 
Fecha de Ingreso: diciembre-2009
Mensajes: 186
Antigüedad: 14 años, 4 meses
Puntos: 5
Respuesta: pasar array por referencia

Si, me refiero a la opción 0, pero con un matiz.
Si tenemos la función:

Código:
function prueba(&$arr,$valor,&$var)
{
    //...................................
    //realiza las instrucciones de busqueda

    //cuando lo encuentra quiero que guarde la referencia en $var
    //ejemplo
    $var=&$arr[2][3][1];
}
la función busca $valor en $arr y lo encuentra en $arr[2][3][1], lo que quiero es que $var devuelva la posicion en la que se encontró $valor (es decir $arr[2][3][1]), pero no quiero que me devuelva por ejemplo un array con los valores [2,3,1] que indiquen que en el primer array se encuentra en la posicion 2, en el segundo en la 3, y en el tercero en la 1, sino una referencia $arr[2][3][1].
Para que cuando llame a la función obtenga esa referencia y pueda modificar el valor buscado en $arr simplemente de la siguinte forma:

Código:
$var=10;
por lo tanto $var que es una referencia a $arr[2][3][1] al darle el valor 10 se cambie en $arr[2][3][1] el valor y valga 10
  #7 (permalink)  
Antiguo 04/10/2010, 04:31
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: pasar array por referencia

a la luz de esta nueva evidencía, entiendo esto

Código PHP:
Ver original
  1. $g=array(1,2,array(1,2,3,array(0,1000)),4);
  2. echo $g[2][3][1]; // mostrandonos 1000
  3. $g[2][3][1] = 3000;
  4. echo $g[2][3][1]; // mostrandonos 3000
  5.  
  6. //y en la función, por ej esto
  7.  
  8. function prueba(&$arr,&$var)
  9. {
  10.     $var = '$g[2][3][1]';
  11. }

bueno, pues desconozco si se pueda devolver tan explicito,
esperaría que abimaelrc pase por aquí a ver si tiene algo
bajo la manga

yo lo haría ya bien sea con lo que dices del array que no quieres,
o incluso enviando el nuevo valor y en la función cambiandolo

suerte con eso
saludos
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #8 (permalink)  
Antiguo 04/10/2010, 04:45
 
Fecha de Ingreso: diciembre-2009
Mensajes: 186
Antigüedad: 14 años, 4 meses
Puntos: 5
Respuesta: pasar array por referencia

Eso es lo que yo intenté,
pero si a $arr[2][3][1] le pones & delate $var devuelve NULL,
y si se lo quitas te debuelve una copia del valor, por lo tanto no me sirve.

Lo preguntaba porque tampoco estoy seguro de que se pueda hacer, sino lo tendre que hacer de la otra forma.
  #9 (permalink)  
Antiguo 04/10/2010, 04:52
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: pasar array por referencia

Cita:
Iniciado por DarkWater Ver Mensaje
Eso es lo que yo intenté,
pero si a $arr[2][3][1] le pones & delate $var devuelve NULL,
y si se lo quitas te debuelve una copia del valor, por lo tanto no me sirve.

Lo preguntaba porque tampoco estoy seguro de que se pueda hacer, sino lo tendre que hacer de la otra forma.
te refieres a lo que te comentaba aquí
o a cual experimento?
si tienes el código de ese experimento
tanto mejor
saludos
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #10 (permalink)  
Antiguo 04/10/2010, 04:58
 
Fecha de Ingreso: diciembre-2009
Mensajes: 186
Antigüedad: 14 años, 4 meses
Puntos: 5
Respuesta: pasar array por referencia

Me referia a la función

Código:
function prueba(&$arr,&$var)
{
    $var = $arr[2][3][1];
}
en este caso $var devuelve una copia del valor de $g[2][3][1];

Código:
function prueba(&$arr,&$var)
{
    $var = &$arr[2][3][1];
}
y en este otro $var devuelve NULL.
  #11 (permalink)  
Antiguo 04/10/2010, 05:13
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: pasar array por referencia

uhm, bueno, pues no me devuelve null la final que mencionas
sino deja en blanco solamente, intente devolver solo la pos así
Código PHP:
$var '[2][3][1]'
pero pues al hacer esto tendríamos las posiciones, pero luego
sería recortarlas para asignarla al array $g, una vuelta más
larga en cuyo caso retomo lo de enviar el valor nuevo de esa
posición en la función que ya se tiene
saludos
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #12 (permalink)  
Antiguo 04/10/2010, 05:51
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: pasar array por referencia

Es que estás trabajando dentro de una función y declarar dentro de una función por referencia, se va a limitar dentro de ella por lo que se conoce como Ámbito de las variables (Variable scope). Una forma de manejar lo que haya dentro de las funciones es declarando uno de los parámetros por referencia (si es que quieres, porque hasta lo veo innecesario) y luego usando la función eval para ejecutar el contenido. Algo así
Código PHP:
Ver original
  1. <?php
  2. $g = array(1, 2, array(1, 2, 3, array(0, 1000)), 4);
  3. $p = '';
  4.  
  5. function prueba($arr,$var){
  6.     /**
  7.      * Manejas lo que quieras con la variable $arr tipo array
  8.      * luego apuntas la ruta exacta de lo que quieres manejar
  9.      * para que lo coloques en la variable
  10.      */
  11.     $value = '';
  12.     foreach($arr as $key => $val){
  13.         if(is_array($val)){
  14.             foreach($val as $k => $v){
  15.                 if(is_array($v)){
  16.                     $value = "[$key][$k]";
  17.                 }
  18.             }
  19.         }
  20.     }
  21.     return $var = '$p =& $g' . $value . ';';
  22. }
  23. $p = prueba($g, $p);
  24. eval($p); // Ejecutamos la referencia
  25. echo '<pre>'; print_r($p); echo '</pre>'; // Muestra que contine el valor de lo que contiene la variable $g[2][3]
  26. echo '<pre>'; print_r($g); echo '</pre>'; // Array original
  27. $p[0] = 2000; // modificamos el valor deseado
  28. echo '<pre>'; print_r($g); echo '</pre>'; // Se hace el cambio a causa de que se hizo la referencia
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Última edición por abimaelrc; 04/10/2010 a las 06:03 Razón: Modificación en el código
  #13 (permalink)  
Antiguo 05/10/2010, 03:30
 
Fecha de Ingreso: diciembre-2009
Mensajes: 186
Antigüedad: 14 años, 4 meses
Puntos: 5
Respuesta: pasar array por referencia

No se me había ocurrido ese metodo.

Al final conseguí hacerlo como tú dijiste, no era como pensaba hacerolo pero también funciona

Gracias a los dos por responder

Etiquetas: pasar, referencia
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:57.