Foros del Web » Programando para Internet » PHP »

Sacar un array desde un bucle

Estas en el tema de Sacar un array desde un bucle en el foro de PHP en Foros del Web. Hola, tengo este HTML. El primer bloque (#bloque-1) aparece por defecto, siendo los demás generados con javascript : @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código HTML: Ver original < ...
  #1 (permalink)  
Antiguo 17/07/2013, 11:06
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Sacar un array desde un bucle

Hola, tengo este HTML. El primer bloque (#bloque-1) aparece por defecto, siendo los demás generados con javascript:

Código HTML:
Ver original
  1. <form method="post" action="">
  2.     <fieldset id="bloque-1">
  3.         <p><input type="text" name="nombre_1" value="" /></p>
  4.         <p><input type="text" name="descripcion_1" value="" /></p>
  5.         <p><input type="text" name="precio_1" value="" /></p>
  6.     </fieldset>
  7.  
  8.     <fieldset id="bloque-2">
  9.         <p><input type="text" name="nombre_2" value="" /></p>
  10.         <p><input type="text" name="descripcion_2" value="" /></p>
  11.         <p><input type="text" name="precio_2" value="" /></p>
  12.     </fieldset>
  13.  
  14.     <fieldset id="bloque-3">
  15.         <p><input type="text" name="nombre_3" value="" /></p>
  16.         <p><input type="text" name="descripcion_3" value="" /></p>
  17.         <p><input type="text" name="precio_3" value="" /></p>
  18.     </fieldset>
  19.  
  20.     <fieldset id="bloque-4">
  21.     ...
  22.  
  23.     <input type="submit" name="enviar" value="enviar" />
  24. </form>

Desearía almacenar los datos en la BD de esta manera (Que cada bloque de inputs se encuentre dentro de un valor):

Código PHP:
Array
(
    [
0] => Array        // Bloque 1
        
(
            [
nombre] => Producto X
            
[descripcion] => Descripción X
            
[precio] => 100
        
)

    [
1] => Array        // Bloque 2
        
(
            [
nombre] => Producto Y
            
[descripcion] => Descripción Y
            
[precio] => 50
        
)

    [
2] => Array       // Bloque 3
        
(
            [
nombre] => Producto Z
            
[descripcion] => Descripción Z
            
[precio] => 50
        
)

El problema es que -a partir de ese HTML- no puedo encontrar una referencia para construir el foreach(), es decir, en conclusión no sé cómo armar el puto bucle para que almacene los datos de la forma indicada. Si alguien puede darme una pista le agradecería en el alma.
  #2 (permalink)  
Antiguo 17/07/2013, 11:09
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Sacar un array desde un bucle

Eso que muestras seria un "array de registros" ... muestra algo que hayas hecho y con gusto te indico
__________________
Salu2!
  #3 (permalink)  
Antiguo 17/07/2013, 11:18
Avatar de RandomName  
Fecha de Ingreso: julio-2013
Mensajes: 32
Antigüedad: 10 años, 9 meses
Puntos: 1
creo que tengo una idea de lo que quieres hacer, intenta hacer una variable i=0 luego con un while o que se yo, el bucle que tu quieras y luego ya que tienes por ejemplo input[0] le das el comando a la base de datos que estes utilizando para guardar los datos de input[0] [producto] [descripcion] [precio]

no se si me di a entender :p espero poder haberte ayudado :)

ah! me falto que al final del bucle le des i++ para que vaya incrementando el array, y listo :D espero haber sido de ayuda :)

Última edición por Triby; 17/07/2013 a las 19:09
  #4 (permalink)  
Antiguo 17/07/2013, 11:26
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Sacar un array desde un bucle

Insertar seria algo asi...

Código PHP:
Ver original
  1. foreach ($array as $reg)
  2. {
  3.       sql_query = "INSERT INTO $tabla (producto,descripcion,precio) VALUES ('{$reg['producto']}','{$reg['descripcion']}',{$reg['precio']}";
  4.       // mysql_query(sql_query ) o simil ...
  5. }

{$reg['precio']} no va entre lleva comillas porque es un campo numerico
__________________
Salu2!
  #5 (permalink)  
Antiguo 17/07/2013, 11:33
Avatar de RandomName  
Fecha de Ingreso: julio-2013
Mensajes: 32
Antigüedad: 10 años, 9 meses
Puntos: 1
Respuesta: Sacar un array desde un bucle

pues si, asi decia yo, te funciono? o no? .3.
  #6 (permalink)  
Antiguo 17/07/2013, 18:33
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Sacar un array desde un bucle

Hola,

Cita:
Iniciado por metacortex Ver Mensaje
... El problema es que -a partir de ese HTML- no puedo encontrar una referencia para construir el foreach(), es decir, en conclusión no sé cómo armar el puto bucle para que almacene los datos de la forma indicada. Si alguien puede darme una pista le agradecería en el alma.
Me imagino que solamente tienes problema para encontrar el inicio y el fin del ciclo, básicamente tendrías que continuar mientras que exista la variable del POST.

Basado en el concepto de RandomName e Italico76,

Código PHP:
Ver original
  1. $i = 1;
  2. while (isset($_POST["nombre_$i"])) {
  3.   $a = array("precio" => $_POST["precio_$i"], etc ...);
  4.   // INSERT INTO ...
  5.   $i++;
  6. }
Saludos,
  #7 (permalink)  
Antiguo 17/07/2013, 18:38
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Sacar un array desde un bucle

Ahora que leo lo que apunta @HackmanC ... veo tienes un mini-PROBLEMA...y es como son esos NAMEs ya que no son arrays precisamente

Esta CONFIRMADO como son los NAMEs ? o sea.. van agregando un prefijo a nombre, descripcion, etc ? ese _numero ? si es asi... lo resolvemos con variables-variables como TU me explicastes a mi @neocortex ;)

Código PHP:
Ver original
  1. <?php
  2. // datos de prueba
  3.  
  4. $_POST   = [];  // no va en programa real
  5. $_POST[0]["nombre_1"]= "alverjas";
  6. $_POST[0]["descripcion_1"] = "verdes, ricas";
  7. $_POST[0]["precio_1"] = 500;
  8.    
  9. $_POST[1]["nombre_2"]= "papas";
  10. $_POST[1]["descripcion_2"] = "de boyaca";
  11. $_POST[1]["precio_2"] = 600;
  12.  
  13. // Fin de datos de prueba
  14.  
  15. $tabla = 'verduras';
  16.  
  17.  
  18. foreach ($_POST as $key => $reg)
  19. {
  20.     $ix = $key +1;
  21.     $nombre = 'nombre_'.$ix;
  22.     $descripcion = 'descripcion_'.$ix;
  23.     $precio = 'precio_'.$ix;
  24.        
  25.     $sql_query = "INSERT INTO $tabla (producto,descripcion,precio) VALUES ('{$_POST[$key][$nombre]}','{$_POST[$key][$descripcion]}',{$_POST[$key][$precio]}";
  26.       // mysql_query($sql_query ) o similar ...
  27.  
  28.     var_dump ($sql_query); // ves que SI esta bien
  29. }
  30.  
  31.  
  32. // Salida:
  33.  
  34. string 'INSERT INTO verduras (producto,descripcion,precio) VALUES ('alverjas','verdes, ricas',500' (length=89)
  35. string 'INSERT INTO verduras (producto,descripcion,precio) VALUES ('papas','de boyaca',600' (length=82)
__________________
Salu2!

Última edición por Italico76; 17/07/2013 a las 18:58
  #8 (permalink)  
Antiguo 17/07/2013, 20:34
Avatar de JDEM  
Fecha de Ingreso: octubre-2008
Ubicación: www....
Mensajes: 154
Antigüedad: 15 años, 6 meses
Puntos: 8
Respuesta: Sacar un array desde un bucle

Saludos,

No me parece logica la manera que mencionan cuando en el FORM pueden colocar:

Cita:
<fieldset id="bloque-1">
<p><input type="text" name="nombre[]" value="" /></p>
<p><input type="text" name="descripcion[]" value="" /></p>
<p><input type="text" name="precio[]" value="" /></p>
</fieldset>

<fieldset id="bloque-2">
<p><input type="text" name="nombre[]" value="" /></p>
<p><input type="text" name="descripcion[]" value="" /></p>
<p><input type="text" name="precio[]" value="" /></p>
</fieldset>

etc
etc...
etc...
<input type="submit" name="enviar" value="enviar" />
</form>
Y recibir ya los valores como array de ellos mismos!!!
__________________
Visitanos http://www.nestsystems.com.ve, mucho mas que solo paginas web.
  #9 (permalink)  
Antiguo 17/07/2013, 20:53
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Sacar un array desde un bucle

Sí, la mejor opción es crear los campos como array:

Código HTML:
Ver original
  1. <fieldset id="bloque-1">
  2. <p><input type="text" name="nombre[]" value="" /></p>
  3. <p><input type="text" name="descripcion[]" value="" /></p>
  4. <p><input type="text" name="precio[]" value="" /></p>
  5.  
  6. <fieldset id="bloque-2">
  7. <p><input type="text" name="nombre[]" value="" /></p>
  8. <p><input type="text" name="descripcion[]" value="" /></p>
  9. <p><input type="text" name="precio[]" value="" /></p>
  10.  
  11. etc
  12.  
  13. <fieldset id="bloque-x">
  14. <p><input type="text" name="nombre[]" value="" /></p>
  15. <p><input type="text" name="descripcion[]" value="" /></p>
  16. <p><input type="text" name="precio[]" value="" /></p>

Primero hay que ver cómo se reciben los datos para saber cómo manipularlos:

Código PHP:
Ver original
  1. var_dump($_POST);
  2.  
  3. /** Dará algo como:
  4. ['nombre'] => array(x) {
  5.       [0] => 'contenido del primer elemento',
  6.       [1] => 'contenido del segundo elemento',
  7.       *** etc ***
  8.       [x] => 'contenido del último elemento',
  9. }
  10. ['descripcion'] => array(x) {
  11.       [0] => 'contenido del primer elemento',
  12.       [1] => 'contenido del segundo elemento',
  13.       *** etc ***
  14.       [x] => 'contenido del último elemento',
  15. }
  16. ['precio'] => array(x) {
  17.       [0] => 'contenido del primer elemento',
  18.       [1] => 'contenido del segundo elemento',
  19.       *** etc ***
  20.       [x] => 'contenido del último elemento',
  21. }
  22. */
  23.  
  24.  
  25. // Para manejarlos:
  26. foreach($_POST['nombre'] as $indice => $nombre) {
  27.     // Ya se tiene $nombre, faltan los otros dos
  28.     $descripcion = $_POST['descripcion'][$indice];
  29.     $precio = $_POST['precio'][$indice];
  30. }
__________________
- León, Guanajuato
- GV-Foto
  #10 (permalink)  
Antiguo 17/07/2013, 21:11
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Sacar un array desde un bucle

Cita:
Iniciado por Triby Ver Mensaje
Sí, la mejor opción es crear los campos como array
Todos creo estamos de acuerdo pero @metacortex menciona que hay partes de ese HTML que son generadas por un JS ... o sea que tocaria que lo ayudaran a generar tambien el HTML de forma concistente con arrays de names en JS
__________________
Salu2!

Última edición por Italico76; 17/07/2013 a las 21:25
  #11 (permalink)  
Antiguo 24/07/2013, 13:01
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Sacar un array desde un bucle

Disculpen la tardanza amigos. A continuación explico cómo se resolvió el problema:

1) Tal como lo mencioné al principio, necesitaba una referencia para poder enganchar el bucle y, en consecuencia, hacer una iteración que a) formara un array por sí misma y b) englobara los $_POST de cada conjunto de formularios dentro de la nueva clave. La respuesta de Triby -aunque propone un método distinto al que necesitaba- me dio una idea que resultó esencial para lograrlo: se me ocurrió incluir un input type=hidden estático con valor de "1" en el bloque:

Código PHP:
Ver original
  1. function rc_submodelos($c = '0') {
  2.     $html ='
  3.     <fieldset id="bloque-1">
  4.         <input type="hidden" name="rc_referencia_datos[]" value="1" />
  5.         <p><input type="text" name="nombre_'. $c .'" value="" /></p>
  6.         <p><input type="text" name="descripcion_'. $c .'" value="" /></p>
  7.         <p><input type="text" name="precio_'. $c .'" value="" /></p>
  8.     </fieldset>';
  9.  
  10. return $html;
  11. }

2) Luego fue cuestión de lógica en base a lo dicho: hacer una primera iteración "madre" que englobara a las "hijas", devolviendo tantos bloques como existan en la BD (o uno vacío si no hay nada). Como la cosa fue hecha en WordPress, agrego unos comentarios para que no se pierdan de nada:

Código PHP:
Ver original
  1. /*
  2. $datos es un array general que controla todo. Puedo agregar
  3. y quitar elementos sin problemas ni trabajo redundante.
  4. Además los nombres de las claves en la BD salen de aquí
  5. */
  6. $datos = array('nombre' , 'descripcion' , 'precio');
  7.  
  8. /*
  9. get_post_meta() es una función de WordPress equivalente al
  10. que devuelve un array de datos de la misma forma que un SELECT
  11. los parámetros son: ('ID de la entrada' , 'campo a modificar' , 'return = true')
  12. */
  13. $postmeta = get_post_meta($post->ID , '_rc_postmeta' , true);
  14.  
  15. if($postmeta) {
  16.     foreach($postmeta as $k => $v)
  17.         $html .= rc_submodelos('c='. $k);
  18. else
  19.     $html .= rc_submodelos();

3) Para guardar los datos usé esta función. El mismo método del doble bucle:

Código PHP:
Ver original
  1. function rc_guardar_producto() {
  2.     global $post, $datos;
  3.  
  4.     $postmeta = get_post_meta($post->ID , '_rc_postmeta' , true);
  5.  
  6.     $datos_form = array();
  7.  
  8.     foreach($_POST['rc_referencia_datos'] as $clave => $valor) {
  9.         $datos_form[$clave] = array();
  10.  
  11.         foreach($datos_editor as $c => $v)
  12.             $datos_form[$clave][$v] = isset($_POST['rc_datos_'. $v .'_'. $clave]) ? $_POST['rc_datos_'. $v .'_'. $clave] : null;
  13.     }
  14.  
  15.     /*
  16.     update_post_meta() es una versión de WordPress
  17.     que abrevia el INSERT e incluye todos los dispositivos
  18.     de seguridad. Una delicia.
  19.     */
  20.     update_post_meta( $post->ID, '_rc_postmeta', $datos_form );
  21.  
  22. die(); // Requerido por WordPress para ingresar datos vía Ajax
  23. }

4) El resultado fue el esperado. Los datos se ingresan en la BD así:

Código PHP:
Array
(
    [
0] => Array        // Bloque 1
        
(
            [
nombre] => Producto X
            
[descripcion] => Descripción X
            
[precio] => 100
        
)

    [
1] => Array        // Bloque 2
        
(
            [
nombre] => Producto Y
            
[descripcion] => Descripción Y
            
[precio] => 50
        
)

    [
2] => Array       // Bloque 3
        
(
            [
nombre] => Producto Z
            
[descripcion] => Descripción Z
            
[precio] => 50
        
)

Como dice mi abuela, "muerto el perro se acabó la rabia". Finalmente les doy 1000 gracias por la ayuda prestada muchachos. Aunque el código trabaja bien, estaré pendiente de cualquier observación a lo mencionado.

---

PD - Importante: Anímense a entrar de lleno con WordPress, cuyo núcleo ofrece tantos recursos que resulta 100% válido usarlo como un framework () y, en consecuencia, realizar proyectos de cualquier nivel y de cualquier tipo en 1/3 del tiempo, manteniendo el mismo control sobre éste como si se tratase de un desarrollo propio. Cero obstáculos. Esta aplicación se aleja años luz de los CMS tradicionales (que no hacen más que limitar el trabajo del programador). En el foro de WordPress estamos a la orden para cualquier duda. Un saludo.

Última edición por metacortex; 24/07/2013 a las 13:07
  #12 (permalink)  
Antiguo 24/07/2013, 15:19
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Sacar un array desde un bucle

Hola,

Cita:
Iniciado por metacortex Ver Mensaje
Aunque el código trabaja bien, estaré pendiente de cualquier observación a lo mencionado.
No miraba la necesidad de insertar un campo que solamente te va a traer un indice secuencial, es decir, rc_referencia_datos, lo estas usando como un contador, y sabiendo con anterioridad que es un contador no vi que fuera necesario agregarlo.

Cita:
Iniciado por metacortex Ver Mensaje
Código PHP:
Ver original
  1. function rc_submodelos($c = '0') {
  2.     $html ='
  3.     <fieldset id="bloque-1">
  4.         <input type="hidden" name="rc_referencia_datos[]" value="1" />
  5.         <p><input type="text" name="nombre_'. $c .'" value="" /></p>
  6.         <p><input type="text" name="descripcion_'. $c .'" value="" /></p>
  7.         <p><input type="text" name="precio_'. $c .'" value="" /></p>
  8.     </fieldset>';
  9.  
  10. return $html;
  11. }
Quitando la referencia a esa variable quedaba algo así:

Código PHP:
function rc_submodelos($c '0') {
    
$html ='
    <fieldset id="bloque-' 
$c '">
        <p><input type="text" name="nombre_'
$c .'" value="" /></p>
        <p><input type="text" name="descripcion_'
$c .'" value="" /></p>
        <p><input type="text" name="precio_'
$c .'" value="" /></p>
    </fieldset>'
;
    return 
$html;

Y en este momento solamente necesitas saber cual es el último campo:

Cita:
Iniciado por metacortex Ver Mensaje
Código PHP:
Ver original
  1. /*
  2. $datos es un array general que controla todo. Puedo agregar
  3. y quitar elementos sin problemas ni trabajo redundante.
  4. Además los nombres de las claves en la BD salen de aquí
  5. */
  6. $datos = array('nombre' , 'descripcion' , 'precio');
  7.  
  8. /*
  9. get_post_meta() es una función de WordPress equivalente al
  10. que devuelve un array de datos de la misma forma que un SELECT
  11. los parámetros son: ('ID de la entrada' , 'campo a modificar' , 'return = true')
  12. */
  13. $postmeta = get_post_meta($post->ID , '_rc_postmeta' , true);
  14.  
  15. if($postmeta) {
  16.     foreach($postmeta as $k => $v)
  17.         $html .= rc_submodelos('c='. $k);
  18. else
  19.     $html .= rc_submodelos();
Por lo que solamente era necesario llevar un contador,

Código PHP:
$datos = array('nombre' 'descripcion' 'precio');
 
$postmeta get_post_meta($post->ID '_rc_postmeta' true);
 
if(
$postmeta) {
    
$i 1;
    while (isset(
$postmeta["nombre_$i"])) {
            
$html .= rc_submodelos($i++);
    }
else
    
$html .= rc_submodelos(); 
Cuando recoges los campos es muy parecido:

Cita:
Iniciado por metacortex Ver Mensaje
Código PHP:
Ver original
  1. function rc_guardar_producto() {
  2.     global $post, $datos;
  3.  
  4.     $postmeta = get_post_meta($post->ID , '_rc_postmeta' , true);
  5.  
  6.     $datos_form = array();
  7.  
  8.     foreach($_POST['rc_referencia_datos'] as $clave => $valor) {
  9.         $datos_form[$clave] = array();
  10.  
  11.         foreach($datos_editor as $c => $v)
  12.             $datos_form[$clave][$v] = isset($_POST['rc_datos_'. $v .'_'. $clave]) ? $_POST['rc_datos_'. $v .'_'. $clave] : null;
  13.     }
  14.  
  15.     /*
  16.     update_post_meta() es una versión de WordPress
  17.     que abrevia el INSERT e incluye todos los dispositivos
  18.     de seguridad. Una delicia.
  19.     */
  20.     update_post_meta( $post->ID, '_rc_postmeta', $datos_form );
  21.  
  22. die(); // Requerido por WordPress para ingresar datos vía Ajax
  23. }
Solamente usando el mismo contador, que había propuesto en el post anterior:

Código PHP:
function rc_guardar_producto() {
    global 
$post$datos;
 
    
$postmeta get_post_meta($post->ID '_rc_postmeta' true);
 
    
$datos_form = array();
 
    
$i 1;
    while (isset(
$postmeta["nombre_$i"])) {
        
$temp = array();
        foreach (
$datos as $dato) {
            
$temp[$dato] = isset($_POST["rc_datos_$dato_$i"]) ? $_POST["rc_datos_$dato_$i"] : null;;
        }
        
$datos_form[] = $temp;
        
$i++;
    }
 
    
update_post_meta$post->ID'_rc_postmeta'$datos_form );
die(); 
// Requerido por WordPress para ingresar datos vía Ajax

Aunque no lo probé, porque no tengo wordpress a la mano, tendría que dar el mismo resultado, creo que solamente sería otra forma de hacer lo mismo. Algunos dicen que si ya te funciona no lo toques mas, así que solo lo escribí como referencia adicional.

Saludos,
  #13 (permalink)  
Antiguo 25/07/2013, 19:56
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Sacar un array desde un bucle

Cita:
Iniciado por HackmanC Ver Mensaje
Algunos dicen que si ya te funciona no lo toques mas
No es mi lema precisamente jejeje (debe ser por eso que vivo metido en problemas). Gracias por tus observaciones, lo probaré a ver. Reconozco que ese input hidden también me parecía un poco chapucero, pues al final se utiliza un recurso que originalmente no es para ese fin. Y aunque "en el furor de la guerra" éste cayó como agua de mayo (presión del cliente), ciertamente resulta válido replantearlo en estos momentos que la cosa está más calmada.

Saludos.

Etiquetas: bucle, html, wordpress
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 13:03.