Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Dividir array en grupos determinando el tamaño de los mismos por una variable

Estas en el tema de Dividir array en grupos determinando el tamaño de los mismos por una variable en el foro de PHP en Foros del Web. Hola amig@s, Tengo una situación para la que no he podido encontrar solución por más que he buscado. Es la siguiente: Necesito actualizar varios registros ...
  #1 (permalink)  
Antiguo 16/07/2012, 14:24
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Dividir array en grupos determinando el tamaño de los mismos por una variable

Hola amig@s,

Tengo una situación para la que no he podido encontrar solución por más que he buscado. Es la siguiente:

Necesito actualizar varios registros de una BD, de manera automática mediante un script con un cron, hasta ahí todo claro.

El problema viene al intentar programar el script. La cosa es así, recibo todos los registros que necesito actualizar en en un array bidimensional, entonces para recorrer el array, debería emplear dos foreach anidados:

Código PHP:
Ver original
  1. $arrayprincipal = array(); //Por plantearlo de una forma simple
  2.  
  3. foreach ($arrayprincipal as $arraysecundario) {
  4.  
  5.         foreach ($arraysecundario as $elemento) {
  6.  
  7.  
  8. echo $elemento."<br>"; //aquí los muestro, pero en la realidad, actualizo los registros
  9.  
  10.         }
  11.  
  12. }

Es decir, el problema no está en recorrerlos, que creo está bien, el problema es que necesito dividir el array en "trozos" de un tamaño dado por una variable, por poner un ejemplo, el array tiene 250 elementos y necesito dividirlo en trozos del tamaño definido por la variable, para después, actualizar uno de los campos de cada registro de cada grupo por un valor diferente, dado por otra variable. Ejemplo:

Código PHP:
Ver original
  1. $tamanio = 15; // El tamaño de cada grupo
  2.  
  3. $arrayprincipal = array(); //Por plantearlo de una forma simple
  4.  
  5. foreach ($arrayprincipal as $arraysecundario) {
  6.  
  7.         foreach ($arraysecundario as $elemento) {
  8.  
  9.  
  10. mysql_query("UPDATE tabla SET elemento='$elemento' WHERE id=$elementodos[id]")
  11. //Aquí $elementodos[] es otro array, pero unidimensional, por eso accedo a él por su indice directamente
  12.  
  13.         }
  14.  
  15. }


Lo he intentado con array_slice, pero tampoco me funciona:

Código PHP:
Ver original
  1. $tamanio = 15; // El tamaño de cada grupo
  2.  
  3. $arrayprincipal = array(); //Por plantearlo de una forma simple
  4.  
  5. foreach ($arrayprincipal as $arraysecundario) {
  6.  
  7. $arraysecundario = array_slice($arraysecundario, 0, $tamanio);
  8.  
  9.         foreach ($arraysecundario as $elemento) {
  10.  
  11.  
  12. mysql_query("UPDATE tabla SET elemento='$elemento' WHERE id=$elementodos[id]")
  13. //Aquí $elementodos[] es otro array, pero unidimensional, por eso accedo a él por su indice directamente
  14.  
  15.         }
  16.  
  17. }

Total, que no tengo ni idea de cómo dividir un array en arrays más pequeños de un tamaño dado y ahora mismo no tengo demasiado claro ni lo que debo hacer, por lo que agradeceré cualquier sugerencia.

Muchas gracias a tod@s por anticipado.

.
  #2 (permalink)  
Antiguo 16/07/2012, 15:49
 
Fecha de Ingreso: enero-2011
Ubicación: DF
Mensajes: 898
Antigüedad: 13 años, 2 meses
Puntos: 155
Respuesta: Dividir array en grupos determinando el tamaño de los mismos por una varia

creo si necesitas definir bien que onda , no te entendí casi nada , estaría bueno ver todo un array de los que dices y en que tabla se insertaría
__________________
No me interesan ni las gracias ni los karmas , pero si que se genere conocimiento, si se dio con la respuesta por favor confirmalo
  #3 (permalink)  
Antiguo 17/07/2012, 00:22
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Dividir array en grupos determinando el tamaño de los mismos por una varia

Hola @mogurbon,

Gracias por tu respuesta.

El array es el resultado de una consulta a la BD, la consulta la hago con la clase spoon y me devuelve un array bidimensional, concretamente en este caso, este array (el del segundo nivel) sólo contiene un dato, es decir, un campo, o sea, podría acceder a los valores como $arrayprincipal[n][dato] donde n es un número de 0 al máximo de registros que contiene el array.

Entonces, con el primer foreach me da una serie de arrays con una key y un valor, ese valor es el que necesito cambiar pero en grupos de un tamaño determinado por una variable obtenida de otra consulta a la BD.

Lo que no tengo ni idea de cómo hacer es la parte de dividir el segundo array en grupos, el resto creo que lo tengo más o menos claro, o por lo menos lo tenía al empezar este post

Espero que alguien me pueda ayudar porque estoy totalmente perdido con esto.

Gracias de nuevo.

.
  #4 (permalink)  
Antiguo 17/07/2012, 01:03
Avatar de cluster28  
Fecha de Ingreso: enero-2008
Ubicación: Donostia - San Sebastián
Mensajes: 756
Antigüedad: 16 años, 3 meses
Puntos: 32
Respuesta: Dividir array en grupos determinando el tamaño de los mismos por una varia

Para empezar puedes hacer un foreach en lugar de dos:

Código PHP:
foreach ($arrayprincipal as $indice => $array_datos) {
        
//Puedes acceder al dato así
        
$dato$array_datos["dato"];

Entiendo que quieres dividir el contenido de $dato, por ejemplo en un valor de cómo máximo 15 caracteres?

Puede hacerlo así:

Código PHP:
$tamanio 15;

while(
strlen($dato) > 0)
{
     
$array_dos[] = substr($dato0$tamanio);

Te quedaría $array_dos con $dato "troceado"

He visto que existe esta función también str-split

Última edición por cluster28; 17/07/2012 a las 01:09 Razón: str-split
  #5 (permalink)  
Antiguo 17/07/2012, 01:52
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Dividir array en grupos determinando el tamaño de los mismos por una varia

Cita:
Iniciado por cluster28 Ver Mensaje
Para empezar puedes hacer un foreach en lugar de dos:

Código PHP:
foreach ($arrayprincipal as $indice => $array_datos) {
        
//Puedes acceder al dato así
        
$dato$array_datos["dato"];

Entiendo que quieres dividir el contenido de $dato, por ejemplo en un valor de cómo máximo 15 caracteres?

Puede hacerlo así:

Código PHP:
$tamanio 15;

while(
strlen($dato) > 0)
{
     
$array_dos[] = substr($dato0$tamanio);

Te quedaría $array_dos con $dato "troceado"
Gracias por tu respuesta @cluster28,

Está genial lo de hacer un foreach en lugar de dos, el problema está en la segunda parte, no me he explicado bien. Lo que necesito no es dividir un string en trozos más pequeños, es dividir el array, o sea, si el array tiene 200 elementos, generar, por decir un ejemplo, 10 arrays de 20 elementos.

Esto no es del todo así porque el tamaño del array varía y el tamaño y la cantidad de las divisiones también, por eso es que lo hago todo con variables, en cada momento las variables toman el valor con el que se debe manejar este array para después actualizar cada división en la BD.

A ver si soy capaz de poner un ejemplo de lo que necesito:

1.- Por un lado tengo un array bidimensional ($array) obtenido de una BD con un dato por cada registro, ese dato lo tengo que actualizar dinámicamente.

2.- Por otro lado tengo una variable ($variable1) que me dice en cuantas partes necesito dividir ese array. ($variable1 = un campo de un registro de una tabla de la BD, específico para guardar ese dato para el siguiente uso)

3.- Por otro, tengo otra variable ($variable2) que me dice de qué cantidad de elementos deben ser las divisiones.

4.- Y por último tengo array2 con los valores para actualizar.

Lo que debe hacer el código que tengo que crear:

Divide $array en $variable1 partes con $variable2 elementos en cada parte:

- La primera parte, cambia el dato por $array2[0]
- La segunda parte, cambia el dato por $array2[1]
- La tercera parte cambia el dato por $array2[2]
- .....
- continua hasta $variable1

Finaliza y actualiza el valor de $variable1 con el nuevo valor.

Creo que no me dejo nada, el problema es que no puedo poner todo el código aquí porque no cabe y concretamente de este script lo único que he sido capaz de hacer, son las operaciones matemáticas necesarias, en el resto estoy perdido por completo.

Espero que alguien me pueda ayudar. Muchas gracias por anticipado y gracias a @mogurbon y a @cluster28 por sus ayudas.

.
  #6 (permalink)  
Antiguo 17/07/2012, 02:44
Avatar de cluster28  
Fecha de Ingreso: enero-2008
Ubicación: Donostia - San Sebastián
Mensajes: 756
Antigüedad: 16 años, 3 meses
Puntos: 32
Respuesta: Dividir array en grupos determinando el tamaño de los mismos por una varia

He hecho una simulación de lo que creo que quieres hacer.

Mira a ver si te vale.

Desde un array bidimensional de 100 arrays de 50 campos genero uno que contiene arrays con el límite dado y cada uno con el límite de campos indicado

Código PHP:
//Creo un array bidimensional de 100 arrays de 50 campos (en tu caso el que recuperes de BD)
for($i=0$i 100$i++)
{
    
$array_temp=array();
    
    for(
$j=0$j 50$j++)
    {
        
$array_temp["dato_".$j] = $j;    
    }
    
    
$array_total[]=$array_temp;
}

//Tamaño de los arrays a generar
$tamanio_array 15;
//Campos dentro de los arrays
$numero_campos 20;

//Inicio del contador de arrays
$n_array 1;
//Inicio de contador de array actual
$i 0;
//Inicio del array de los arrays divididos (resultado)
$array_dividido = array();

//Por cada array del array generado
foreach($array_total as $array_datos)
{
    
//Inicio del contador del campo actual
    
$j 0;
    
//Inicio del array temporal
    
$array_temporal = array();
    
//Por cada campo del array de datos
    
foreach($array_datos as $campo => $valor)
    {
        
//Pasamos el valor al array temporal con el mismo nombre de campo
        
$array_temporal[$campo] = $valor;
        
//Sumamos uno al contador del campo actual y lo comparamos con el límite de campos, si es igual rompemos el foreach
        
if(++$j == $numero_campos){ break; }
    }
    
//Pasamos el array temporal al array del resultado
    
$array_dividido[$n_array][] = $array_temporal;
    
//Sumamos uno al contador de arrays y lo comparamos con el límite de arrays, si es igual ponemos el contador a 0 
    //e incializamos el campo del siguiente array
    
if(++$i == $tamanio_array){ $i=0$n_array++; }
}

//mostrar_array
echo "<b>".__FILE__.":".__LINE__."</b><br><pre>".print_r($array_dividido,true)."</pre>";flush(); 
  #7 (permalink)  
Antiguo 17/07/2012, 06:00
Avatar de oscartt67  
Fecha de Ingreso: abril-2012
Ubicación: fonollosa
Mensajes: 481
Antigüedad: 12 años
Puntos: 97
Respuesta: Dividir array en grupos determinando el tamaño de los mismos por una varia

Hola rbczgz.
Sin profundizar demasiado en el post, y sin estar familiarizado con array_slice, veo que cuando utilizas dicha función:

Cita:
$arraysecundario = array_slice($arraysecundario, 0, $tamanio);
le pasas el 0 como segundo parámetro, y eso hará que siempre empieze al principio del array.
Miírate bién la documentación de esta función. Ya dije que no la conozco bien, pero leyendo por encima me parece que puede ser la causa de tu problema.

Saludos.
  #8 (permalink)  
Antiguo 17/07/2012, 11:43
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Dividir array en grupos determinando el tamaño de los mismos por una varia

Muchísimas gracias @cluster28,

Ese código me divide el array tal como necesito, pero como no lo entiendo no se dónde debería incorporar la sentencia de actualización ni qué valores colocar.

Estoy muy verde con el tema de los arrays, parecía que los estaba empezando a entender y ahora me encuentro con este lío que no tengo ni idea de por dónde tirar.

Te agradecería si me puedes explicar con muuuuucha paciencia cómo funciona el código, que está muy bien comentado, pero yo no lo entiendo

Y de paso, si me puedes explicar dónde debería incorporar la sentencia de actualización y qué valores colocar, sería muy de agradecer.

.
  #9 (permalink)  
Antiguo 18/07/2012, 00:55
Avatar de cluster28  
Fecha de Ingreso: enero-2008
Ubicación: Donostia - San Sebastián
Mensajes: 756
Antigüedad: 16 años, 3 meses
Puntos: 32
Respuesta: Dividir array en grupos determinando el tamaño de los mismos por una varia

Al principio te vuelves loco, pero una vez que lo pillas es sencillo.

Te pongo unos ejemplos para que veas las estructuras. Hay dos tipos de arrays, Asociativos e Indexados (es lo primero que hay que entender). En la práctica son iguales.

Las funciones las puedes buscar en php.net para entenderlas bien. Hay algunas del ejemplo anterior que no las he puesto porque no considero que sean tema de arrays.

Código PHP:
//Fución de muestra de bucles
function muestra_bucles($array)
{
    echo 
'<br>Bucle foreach ($array as $indice => $valor)<br>';
    foreach (
$array as $indice => $valor)
    {
        echo 
"Indice: $indice => Valor: $valor<br>";
    }
    
    echo 
'<br>Bucle foreach ($array as $valor)<br>';
    foreach (
$array as $valor)
    {
        echo 
"Valor: $valor<br>";
    }
}

//Arrays indexados
$array_indexado = array("1""2""3");
//Es lo mismo que este
$array_indexado2 = array();
$array_indexado2[] = "1";
$array_indexado2[] = "2";
$array_indexado2[] = "3";

//Arrays asociativos (pones nombre a los índices)
$array_asociativo = array("indice_1"=>"1""indice_2"=>"2""indice_3"=>"3");
//Es lo mismo que este
$array_asociativo2 = array();
$array_asociativo2["indice_1"] = "1";
$array_asociativo2["indice_2"] = "2";
$array_asociativo2["indice_1"] = "3";

//Array asociativo bidimensional
$array_asociativo_bi = array(    "indice_1"=>array("item_1"=>"1"), 
                                
"indice_2"=>array("item_2"=>"2"), 
                                
"indice_3"=>array("item_3"=>"3"));
//Es lo mismo que este
$array_asociativo_bi2=array();
$array_asociativo_bi2["indice_1"]["item_1"]="1";
$array_asociativo_bi2["indice_2"]["item_2"]="2";
$array_asociativo_bi2["indice_3"]["item_3"]="3";

//Aquí puedes ver la estructura de los arrays
echo '$array_indexado<br>';
echo 
"<pre>".print_r($array_indexado,true)."</pre>";
echo 
'$array_asociativo<br>';
echo 
"<pre>".print_r($array_asociativo,true)."</pre>";
echo 
'$array_asociativo_bi<br>';
echo 
"<pre>".print_r($array_asociativo_bi,true)."</pre>";

//Bucles
echo '<br>$array_indexado<br>';
muestra_bucles($array_indexado);
echo 
'<br>$array_asociativo<br>';
muestra_bucles($array_asociativo);
echo 
'<br>$array_asociativo_bi<br>';
muestra_bucles($array_asociativo_bi); 
Espero que te ayude...
  #10 (permalink)  
Antiguo 18/07/2012, 01:15
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Dividir array en grupos determinando el tamaño de los mismos por una varia

Muchas gracias @cluster28,

Creo que ahora ya entiendo mucho mejor lo referente a arrays.

.

Etiquetas: dividir, grupos, mysql, registro, tabla, tamaño, 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 22:56.