Foros del Web » Programando para Internet » PHP »

Duda con foreach y agregado de valores

Estas en el tema de Duda con foreach y agregado de valores en el foro de PHP en Foros del Web. Buenas a todos. Estoy tonteando con foreach, y tengo una duda (no es un problema). Variables: listaCategoria - Contiene un array de arrays. listaCategoria[0]['idCategoria'] = ...
  #1 (permalink)  
Antiguo 09/02/2012, 13:51
 
Fecha de Ingreso: mayo-2008
Mensajes: 103
Antigüedad: 16 años, 5 meses
Puntos: 14
Duda con foreach y agregado de valores

Buenas a todos.

Estoy tonteando con foreach, y tengo una duda (no es un problema).

Variables:
listaCategoria - Contiene un array de arrays.
listaCategoria[0]['idCategoria'] = "blabla".
listaCategoria[0]['nombreCategoria'] = "bleble".
datosLista = donde guardo la lista una vez declarada.

Mostrar esto lo hago:

Código PHP:
$datosLista $listaCategoria;
// Un poquito más tarde...

foreach ($datosLista as $categoria){
    echo 
"ID:".$categoria['idCategoria'].", nombre:".$categoria['nombreCategoria'];
    echo 
"<br>";

Pero ahora, imaginemos que quiero agregar un valor a una llave dada. Por ejemplo;

listaCategoria[0]['cosaSuperImportante'] = "anonymous";


... si hago lo siguiente el agregado desde el foreach ¡no funciona!

Código PHP:
        foreach ($listaCategorias as $categoria){
            
$categoria['cosaSuperImportante'] = "anonymous";
        }
        
$datosLista $listaCategorias

... y en cambio ESTO sí funciona!

Código PHP:
        foreach ($listaCategorias as $categoria){
            
$categoria['cosaSuperImportante'] = "anonymous";
            
array_push($datosLista,$categoria);
        } 
  #2 (permalink)  
Antiguo 09/02/2012, 13:56
Avatar de CesarHC  
Fecha de Ingreso: junio-2011
Ubicación: localhost
Mensajes: 566
Antigüedad: 13 años, 5 meses
Puntos: 56
Respuesta: Duda con foreach y agregado de valores

Bueno el segundo te funciona porque eso mismo hace array push(inserta uno o más elementos al final de un array).
__________________
Solo la práctica no te traicionara ¡¡¡¡¡¡

Seguir el camino tu debes PHP The Right Way.
  #3 (permalink)  
Antiguo 09/02/2012, 14:17
Avatar de zarkiel  
Fecha de Ingreso: febrero-2012
Mensajes: 51
Antigüedad: 12 años, 9 meses
Puntos: 15
Respuesta: Duda con foreach y agregado de valores

La solución seria que en foreach también le dieras el indice así:

Código PHP:
Ver original
  1. foreach ($listaCategorias as $key=>$categoria){
  2.        $listaCategorias[$key]['cosaSuperImportante'] = "anonymous";
  3. }
  4. $datosLista = $listaCategorias;

Así modificamos el array directamente.
__________________
« Los deseos pueden hacerse realidad, pero no basta con esperar un milagro, el milagro lo hacemos nosotros... Aquí y ahora »
  #4 (permalink)  
Antiguo 09/02/2012, 14:22
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 4 meses
Puntos: 793
Respuesta: Duda con foreach y agregado de valores

Es que lo tienes que agregar es al array no al valor del foreach:

Código PHP:
Ver original
  1. $listaCategoria[0]['cosaSuperImportante'] = "anonymous";

tampoco tiene sentido agregar ese valor dentro del foreach ya que se va a sobreescribir en cada iteración para el índice [0].

Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #5 (permalink)  
Antiguo 10/02/2012, 05:58
 
Fecha de Ingreso: mayo-2008
Mensajes: 103
Antigüedad: 16 años, 5 meses
Puntos: 14
Respuesta: Duda con foreach y agregado de valores

Gracias por las respuestas.

@CesarHC Pero el array_push lo hago en base a $categoria, por lo que si lo muestra es porque $categoria es efectivamente modificada. Pero sólo modifica $categoria, no el array de donde viene. Eso es lo raro.

@zarkiel La solución del Key me parece interesante. Gracias!

@andres No sobreesribe la iteración para el índice[0], sino que hace la escritura sobre la $categoria actual. Lo digo porque es lo que estoy usando ahora y funciona correctamente, cada valor reescrito bien...
De todas formas, coincidis en que tengo que cambiar el array directamente. Lo que me confunde es porqué $categoria es modificada correctamente pero no $listaCategoria, ¿foreach crea entocnes un array temporal?
  #6 (permalink)  
Antiguo 10/02/2012, 11:16
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 4 meses
Puntos: 793
Respuesta: Duda con foreach y agregado de valores

Categoría son los elementos que estás recorriendo del array listaCategorias que pasa a tener la estructura interna:

Array
(
[idCategoria] => blabla
[nombreCategoria] => bleble
)

No hace falta volver a guardar el array en otra variable datosLista.

Cita:
Iniciado por Urdaris_Nox Ver Mensaje
Lo que me confunde es porqué $categoria es modificada correctamente pero no $listaCategoria, ¿foreach crea entocnes un array temporal?
Exactamente estás creando un nuevo array "temporal" con la estructura:

Array
(
[idCategoria] => blabla
[nombreCategoria] => bleble
[cosaSuperImportante] => anonymous
)

Con array push lo que haces es agregar ese array "temporal" al final de tu array. Este array "temporal" siempre se sobrescribe con el último elemento de tu array principal.

Ahora en el segundo ejemplo puedes agregar ese elemento sin tener que usar array_push.

Código PHP:
Ver original
  1. <?php
  2.  
  3. $listaCategoria[0]['idCategoria'] = "blabla";
  4. $listaCategoria[0]['nombreCategoria'] = "bleble";
  5. $listaCategoria[1]['idCategoria'] = "blabla";
  6. $listaCategoria[1]['nombreCategoria'] = "bleble";
  7.  
  8. foreach ($listaCategoria as &$categoria){
  9.     $categoria['cosaSuperImportante'] = "anonymous";
  10. }
  11.  
  12. unset($categoria); //Borramos la referencia
  13.  
  14. echo '<pre>';
  15. print_r($listaCategoria);
  16. echo '</pre>';

Eso agregaría un elemento a cada índice numérico con la clave "cosaSuperImportante" y el valor de "anonymous".

Sobre sobrescribir... Me refería a este ejemplo:

Código PHP:
Ver original
  1. <?php
  2. $listaCategoria[0]['idCategoria'] = "blabla";
  3. $listaCategoria[0]['nombreCategoria'] = "bleble";
  4. $listaCategoria[1]['idCategoria'] = "blabla";
  5. $listaCategoria[1]['nombreCategoria'] = "bleble";
  6.  
  7. foreach ($listaCategoria as $categoria) {
  8.     $listaCategoria[0]['cosaSuperImportante'] = "anonymous";
  9. }
  10.  
  11. echo '<pre>';
  12. print_r($listaCategoria);
  13. echo '</pre>';

Si no varia la clave, en este caso "0" se va a crear el array con cosaSuperImportante en el índice cero pero el uno no lo va a tener. En este caso el foreach es totalmente inútil.

Espero que hayas entendido algo.

Saludos.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #7 (permalink)  
Antiguo 15/02/2012, 16:44
 
Fecha de Ingreso: mayo-2008
Mensajes: 103
Antigüedad: 16 años, 5 meses
Puntos: 14
Respuesta: Duda con foreach y agregado de valores

Sí sí, clarísimo! Gracias hombre!

La solución que me has ofrecido utiliza punteros, si no me equivoco. Ya me peleé en su día en C con punteros (y punteros a punteros ), así que no me suena a chino.

Lo que no tenía ni idea de que se pudiera utilizar en PHP!

Y la explicación también perfectamente entendida; array temporal explica lo que sucedía.

Muchas gracias a todos por vuestra ayuda, de verdad :)

Etiquetas: agregado, foreach, variables
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 23:14.