Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Recorrer un array seleccionando solo un elemento por fila

Estas en el tema de Recorrer un array seleccionando solo un elemento por fila en el foro de PHP en Foros del Web. Hola: Estoy intentando crear un codigo que recorra un array de tipo: A B C D 1-- 15 20 35 30 2-- 33 13 33 ...
  #1 (permalink)  
Antiguo 21/11/2013, 05:32
 
Fecha de Ingreso: noviembre-2013
Mensajes: 10
Antigüedad: 10 años, 4 meses
Puntos: 0
Recorrer un array seleccionando solo un elemento por fila

Hola:

Estoy intentando crear un codigo que recorra un array de tipo:

A B C D

1-- 15 20 35 30
2-- 33 13 33 20
...
...
...
n-- 05 35 40 20

Donde los datos son las posibilidades de que ocurra un evento entre 4 posibles resultados.

La idea es guardar en otro array , las posibilidades de que haya ocurrido la serie de resultados , es decir: 1A 2C .... nB . Eso con todas las posibles posibilidades.

Para hacerlo lo único que se me ocurre es un bucle for por cada fila con variables desde 0 hasta 3, pero queda muy engorroso ya que hay que crear N filas for.

for(....)
{
for(...)
{
.
.
.
}

¿Existe alguna forma de simplificarlo , o de ponerlo "bonito"?

Muchas gracias.
  #2 (permalink)  
Antiguo 21/11/2013, 06:43
Avatar de xSkArx  
Fecha de Ingreso: marzo-2008
Ubicación: Chile
Mensajes: 945
Antigüedad: 16 años
Puntos: 96
Respuesta: Recorrer un array seleccionando solo un elemento por fila

El array de array quieres dejarlo en un array de string?
Podrias hacer algo asi
Código PHP:
Ver original
  1. $arraynuevo=array();
  2. for($i=0; $i<(count($arrayprob)-1); $i++){
  3. for($j=0; $j<(count($arrayprob[$i])-1); $j++){
  4. $arraynuevo[]="{$i}{$j}";
  5. }
  6. }
__________________
Busca, lee y practica todo lo que puedas.
Usa siempre el buscador antes de postear.
Si posteas código, utiliza el HIGHLIGHT correcto.
  #3 (permalink)  
Antiguo 21/11/2013, 06:59
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años
Puntos: 574
Respuesta: Recorrer un array seleccionando solo un elemento por fila

No es tan complicado.... solo 4 for....

Tus datos son un conjunto de n A, n B, n C, n D....

A1,A2,.....,An
B1,B2,.....,Bn
C1,C2,.....,Cn
D1,D2,.....,Dn

Luego debes recorrerlos de forma anidada...

Código PHP:
Ver original
  1. $arreglo=[[0]=>[A=>0,B=>0,C=>0,D=>0]
  2.                  [1]=>[A=>1,B=>1,C=>1,D=>1]
  3.                  ....
  4.                  [n]=>[A=>n,B=>n,C=>n,D=>n]
  5.                ]
  6.  
  7. $resultado=array();
  8. for ($a=0;$a<count($arreglo);$a++){
  9.   for ($b=0;$b<count($arreglo);$b++){
  10.     for ($c=0;$c<count($arreglo);$c++){
  11.       for ($d=0;$d<count($arreglo);$d++){
  12.            $combina=array();
  13.            $combina["A"]=$arreglo[$a]["A"];
  14.            $combina["B"]=$arreglo[$b]["B"];
  15.            $combina["C"]=$arreglo[$c]["C"];
  16.            $combina["D"]=$arreglo[$d]["D"];
  17.  
  18.           $resultado[]=$combina;
  19.       }
  20.     }
  21.   }
  22. }


$resultado será

A0,B0,C0,D0
A0,B0,C0,D1
A0,B0,C0,D2
....
A0,B0,C0,Dn-1
A0,B0,C1,D0
A0,B0,C1,D1
A0,B0,C1,D2
....
A0,B0,C1,Dn-1
.....
A0,B0,Cn-1,Dn-1
...
A0,Bn-1,Cn-1,Dn-1
...
An-1,Bn-1,Cn-1,Dn-1

No?

Puedes usar indices numéricos

$combina[0]=$arreglo[$a][0];
$combina[1]=$arreglo[$b][1];
$combina[2]=$arreglo[$c][2];
$combina[3]=$arreglo[$d][3];
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 21/11/2013 a las 07:11
  #4 (permalink)  
Antiguo 21/11/2013, 09:01
 
Fecha de Ingreso: noviembre-2013
Mensajes: 10
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: Recorrer un array seleccionando solo un elemento por fila

Creo que no he logrado explicar bien lo que quiero hacer, lo siento.

Como ejemplo bueno, imaginaros que la tabla fuera la probabilidad de los signos de la quiniela las posibilidades del 1x2 las columnas y 14 partidos las filas .

Lo que quiero hacer es un array pongamos $posibilidades que tendria del orden en el ejemplo anterior de 4 millones de elementos , una por cada quiniela posible y cada elemento sea la probabilidad de esa quiniela.
  #5 (permalink)  
Antiguo 21/11/2013, 11:28
Avatar de xSkArx  
Fecha de Ingreso: marzo-2008
Ubicación: Chile
Mensajes: 945
Antigüedad: 16 años
Puntos: 96
Respuesta: Recorrer un array seleccionando solo un elemento por fila

Que es una.quiniela?
__________________
Busca, lee y practica todo lo que puedas.
Usa siempre el buscador antes de postear.
Si posteas código, utiliza el HIGHLIGHT correcto.
  #6 (permalink)  
Antiguo 21/11/2013, 11:35
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 16 años, 8 meses
Puntos: 194
Respuesta: Recorrer un array seleccionando solo un elemento por fila

Cita:
Iniciado por quimfv Ver Mensaje
for ($a=0;$a<count($arreglo);$a++){
for ($b=0;$b<count($arreglo);$b++){
for ($c=0;$c<count($arreglo);$c++){
for ($d=0;$d<count($arreglo);$d++){
//foo....
}
}
}
}[/HIGHLIGHT]
Es una locura el desperdicio de recursos en ese anidado, sobretodo si arreglo llega a ser grande...

Los count acostumbren a usarlos fuera del ciclo, asi no se calcula en cada vuelta del mismo.

Código PHP:
Ver original
  1. $foo = count($algo);
  2. for( $j=0; $j<$foo;j++)
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #7 (permalink)  
Antiguo 21/11/2013, 11:43
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 2 meses
Puntos: 206
Respuesta: Recorrer un array seleccionando solo un elemento por fila

No entiendo nada. Haz un buen ejemplo completo de los datos que tienes, y de los datos que quieras conseguir, aunque sea con poca información (por ejemplo, 3 columnas y 4 filas.
Ah, releyendo lo he entendido. La solución ya te la ha dado quimfv, auqnue tienes que ser consciente de que como la tabla contenga mucha información, el tiempo de ejecución se puede disparar.
  #8 (permalink)  
Antiguo 21/11/2013, 12:22
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 8 meses
Puntos: 793
Respuesta: Recorrer un array seleccionando solo un elemento por fila

Cita:
Iniciado por h2swider Ver Mensaje
Los count acostumbren a usarlos fuera del ciclo, asi no se calcula en cada vuelta del mismo.

Código PHP:
Ver original
  1. $foo = count($algo); //BIEN
  2. for( $j=0; $j<$foo;j++)
También puede ser:

Código PHP:
Ver original
  1. for($i = 0, $foo = count($algo); $i < $foo; ++$i) { //BIEN
  2.     //...
  3. }

pero nunca:

Código PHP:
Ver original
  1. for ($a=0;$a<count($arreglo);$a++){ //MAL
__________________
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
  #9 (permalink)  
Antiguo 21/11/2013, 12:25
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 2 meses
Puntos: 206
Respuesta: Recorrer un array seleccionando solo un elemento por fila

Si no quieres escribir un montón de fors anidados, se puede utilizar recursividad, que es algo mas costosa de rendimiento, pero por contra es capaz de combinar cualquier array bidiomensional, sin importar el número de filas o columnas que tenga.

Código Javascript:
Ver original
  1. var quiniela=[
  2.     [90, 8, 2],
  3.     [34, 33, 33],
  4.     [2, 49, 49],  
  5.     [2, 8, 90]
  6. ];
  7.  
  8. var combinaciones=[];
  9. function combinarTodo(indices)
  10. {
  11.     var filas=quiniela.length;
  12.     var columnas=quiniela[0].length;
  13.     if (indices.length==filas)
  14.     {
  15.         var arr=[];
  16.         for (var i=0;i<filas;i++)
  17.         {
  18.             arr.push(quiniela[i][indices[i]]);
  19.         }
  20.         combinaciones.push(arr.join("-"));
  21.         return;
  22.     }
  23.     for (var i=0;i<columnas;i++)
  24.     {
  25.         indices.push(i);
  26.         combinarTodo(indices);
  27.         indices.pop();
  28.     }
  29. }
  30.  
  31. combinarTodo([]);
  32. document.getElementById("div").innerHTML=combinaciones.join("<br/>");

Funcionando:
http://jsfiddle.net/CP9vw/
  #10 (permalink)  
Antiguo 21/11/2013, 14:03
 
Fecha de Ingreso: octubre-2012
Mensajes: 135
Antigüedad: 11 años, 5 meses
Puntos: 8
Respuesta: Recorrer un array seleccionando solo un elemento por fila

Cita:
Iniciado por xSkArx Ver Mensaje
Que es una.quiniela?


http://es.wikipedia.org/wiki/La_Quiniela_(Espa%C3%B1a)

Juego de azar español, donde pones el resultado que esperas de los partidos, y si aciertas ganas dinero.
  #11 (permalink)  
Antiguo 21/11/2013, 14:22
Avatar de xSkArx  
Fecha de Ingreso: marzo-2008
Ubicación: Chile
Mensajes: 945
Antigüedad: 16 años
Puntos: 96
Respuesta: Recorrer un array seleccionando solo un elemento por fila

Tambien puede usar foreach
Código PHP:
Ver original
  1. foreach($arreglo as $array){
  2. $newarray[]=$array[array_rand($array)];
  3. }
  4. }
__________________
Busca, lee y practica todo lo que puedas.
Usa siempre el buscador antes de postear.
Si posteas código, utiliza el HIGHLIGHT correcto.

Última edición por xSkArx; 21/11/2013 a las 14:29
  #12 (permalink)  
Antiguo 21/11/2013, 16:44
 
Fecha de Ingreso: noviembre-2013
Mensajes: 10
Antigüedad: 10 años, 4 meses
Puntos: 0
De acuerdo Respuesta: Recorrer un array seleccionando solo un elemento por fila

Cita:
Iniciado por marlanga Ver Mensaje
Si no quieres escribir un montón de fors anidados, se puede utilizar recursividad, que es algo mas costosa de rendimiento, pero por contra es capaz de combinar cualquier array bidiomensional, sin importar el número de filas o columnas que tenga.

Código Javascript:
Ver original
  1. var quiniela=[
  2.     [90, 8, 2],
  3.     [34, 33, 33],
  4.     [2, 49, 49],  
  5.     [2, 8, 90]
  6. ];
  7.  
  8. var combinaciones=[];
  9. function combinarTodo(indices)
  10. {
  11.     var filas=quiniela.length;
  12.     var columnas=quiniela[0].length;
  13.     if (indices.length==filas)
  14.     {
  15.         var arr=[];
  16.         for (var i=0;i<filas;i++)
  17.         {
  18.             arr.push(quiniela[i][indices[i]]);
  19.         }
  20.         combinaciones.push(arr.join("-"));
  21.         return;
  22.     }
  23.     for (var i=0;i<columnas;i++)
  24.     {
  25.         indices.push(i);
  26.         combinarTodo(indices);
  27.         indices.pop();
  28.     }
  29. }
  30.  
  31. combinarTodo([]);
  32. document.getElementById("div").innerHTML=combinaciones.join("<br/>");

Funcionando:
[url]http://jsfiddle.net/CP9vw/[/url]
Lo primero , muchas gracias a todos por la implicación.

El codigo que me han puesto usando la idea de cambiar filas por columnas, no servia para el proposito que queria, no arrojaba los resultados que debía . Sin embargo este código que ha puesto Marlanga , recorre el array perfectamente. Voy a estudiarle bien como funciona ya que aún no tengo muy claro como funciona, pero es obvio que has dado en el clavo, gracias.

SOLUCIONADO.
  #13 (permalink)  
Antiguo 22/11/2013, 02:39
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años
Puntos: 574
Respuesta: Recorrer un array seleccionando solo un elemento por fila

Ojo que ese codigo no es php....deberas traducirlo, si quieres que corra en el servidor.

Por otro lado tiene toda la razon los que han indicado que repetir el count($arreglo) es un error pero una vez hecha la substitución que han propuesto el codigo da lo que buscas....

Tanto mi codigo como el javascript de @marlanga puden llegar a bloquear la maquina si n es grande.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Etiquetas: elemento, fila, variable
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 08:03.