Foros del Web » Programando para Internet » PHP »

Cálculos con arrays multi-dimensionales

Estas en el tema de Cálculos con arrays multi-dimensionales en el foro de PHP en Foros del Web. Hola. Acudo a vosotros para que me ayudéis en lo posible o me déis alguna idea de cómo hacer lo que os explico a continuación. ...
  #1 (permalink)  
Antiguo 03/04/2013, 01:14
 
Fecha de Ingreso: octubre-2007
Mensajes: 17
Antigüedad: 16 años, 6 meses
Puntos: 0
Cálculos con arrays multi-dimensionales

Hola.

Acudo a vosotros para que me ayudéis en lo posible o me déis alguna idea de cómo hacer lo que os explico a continuación.

Tengo una función en PHP donde los datos que "entran" son dos arrays multi-dimensionales de la forma:

Código:
$muestra0 = array( 
                               0 => (1 => 'P', 4 => 'V', 18 => 'b', 19 => 'a'), 
                               1 => (1 => 'P', 4 => 'v', 18 => 'b', 19 => 'a'), 
                               2 => (1 => 'P', 4 => 'V', 18 => 'b', 19 => 'A'));

$muestra1 = array( 
                               0 => (1 => 'P', 4 => 'v', 18 => 'b', 19 => 'A'), 
                               1 => (1 => 'P', 4 => 'v', 18 => 'b', 19 => 'A'), 
                               2 => (1 => 'p', 4 => 'V', 18 => 'B', 19 => 'A'));
Estos arrays pueden tener n arrays donde las claves pueden existir o no, y esas claves siempre tienen las mismas dos combinaciones en sus valores, por ejemplo, la clave 1 puede tener el valor v o V, o la clave 7 los valores r o R. El resultado devuelto debe ser una array con todas las combinaciones posibles entre los arrays muestra0 y muestra1, de la manera:

Código:
$resultado = array( 
                               0 => (1 => 'P-P', 4 => 'V-v', 18 => 'b-b', 19 => 'a-A'), 
                               1 => (1 => 'P-P', 4 => 'V-v', 18 => 'b-b', 19 => 'a-A'), 
                               2 => (1 => 'P-p', 4 => 'V-V', 18 => 'B-b', 19 => 'a-A'), 
                               3 => (1 => 'P-P', 4 => 'v-v', 18 => 'b-b', 19 => 'a-A'), 
                               4 => (1 => 'P-P', 4 => 'v-v', 18 => 'b-b', 19 => 'a-A'), 
                               5 => (1 => 'P-p', 4 => 'V-v', 18 => 'B-b', 19 => 'a-A'), 
                               6 => (1 => 'P-P', 4 => 'V-v', 18 => 'b-b', 19 => 'A-A'), 
                               7 => (1 => 'P-P', 4 => 'V-v', 18 => 'b-b', 19 => 'A-A'), 
                               8 => (1 => 'P-p', 4 => 'V-V', 18 => 'B-b', 19 => 'A-A'));
En este array según la clave el elemento en mayúsculas se ha de colocar primero, en otros, como en la clave 19, el valor pasado por muestra0 siempre irá primero.

Bien, esto lo he hecho mediante foreachs anidados y una serie de ifs dentro de ellos y el resultado es correcto. Pero el problema viene cuando se añaden más elementos al array, por ejemplo:

Código:
$muestra0 = array( 
                               0 => (1 => 'P', 4 => 'V', 7 => 'r', 18 => 'b', 19 => 'a'), 
                               1 => (1 => 'P', 4 => 'v', 7 => 'R', 18 => 'b', 19 => 'a'), 
                               2 => (1 => 'P', 4 => 'V', 7 => 'R', 18 => 'b', 19 => 'A')
                               ...);

$muestra1 = array( 
                               0 => (1 => 'P', 4 => 'v', 7 => 'r', 18 => 'b', 19 => 'A'), 
                               1 => (1 => 'P', 4 => 'v', 7 => 'r', 18 => 'b', 19 => 'A'), 
                               2 => (1 => 'p', 4 => 'V', 7 => 'r', 18 => 'B', 19 => 'A')
                               ...);
Al añadir más elementos el tiempo de cálculo se va incrementado provocando en cierto número de elementos un error de tiempo de ejecución excedido. ¿Podria resolverlo mediante una función recursiva? En caso afirmativo, ¿cómo?

Gracias.

PD. Perdonad si algunos nombres o conceptos no los he empleado correctamente, pero soy bastante novato en esto y lo aprendido ha sido de forma autodidacta.
  #2 (permalink)  
Antiguo 03/04/2013, 01:44
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años
Puntos: 58
Respuesta: Cálculos con arrays multi-dimensionales

Siempre puedes ampliar el tiempo límite de ejecución del script
set_time_limit(3000); (en segundos)

O cambiarlo en el php.ini en max_execution_time (mejor la otra opción).

Lo que no se si se podría mejorar tu código, sino lo pones poco se puede hacer.
  #3 (permalink)  
Antiguo 03/04/2013, 02:11
 
Fecha de Ingreso: octubre-2007
Mensajes: 17
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: Cálculos con arrays multi-dimensionales

Gracias por tan rápida respuesta, alyciashape.

El caso es que de lo que quiero hacer ya existe algo y ese "algo" no tiene probelmas con los tiempos de ejecución. De todas formas pongo el código a ver si se puede mejorar:

Código PHP:
function crossing(array $muestra0, array $muestra1) {
$resultado = array();
$i 0;

foreach (
$muestra0 as $rowm=>$mal) {
    foreach (
$muestra1 as $rowf=>$fem) {    
        foreach (
$fem as $colm=>$fml) {
            if (!
preg_match('/(R|S|T|A|Q)/'$fml))
                
$resultado[$i][$colm] = $fml.'-'.$mal[$colm];
            else if (
preg_match('/(R|S|T)/'$mal[$colm]) && preg_match('/W/'$resultado[$i][0])) 
                
$resultado[$i][$colm] = '';
            else if (
preg_match('/(R|S|T)/'$fml) && preg_match('/(r|s|t)$/'$mal[$colm]) && preg_match('/W/'$resultado[$i][0])) 
                
$resultado[$i][$colm] = $mal[$colm].'-'.$mal[$colm];
            else if (
preg_match('/(R|S|T)/'$fml) && preg_match('/(r|s|t)$/'$mal[$colm]) && preg_match('/Z/'$resultado[$i][0])) 
                
$resultado[$i][$colm] = $mal[$colm].'-'.$fml;
            else 
                
$resultado[$i][$colm] = $mal[$colm].'-'.$fml;
            }
        
$i++;    
        }
    }
return 
$resultado;

  #4 (permalink)  
Antiguo 03/04/2013, 11:12
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: Cálculos con arrays multi-dimensionales

Intenta hacerlo pero sin expresiones regulares a ver si funciona mejor. Dan mucha comodidad pero son más lentas.
__________________
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 04/04/2013, 00:15
 
Fecha de Ingreso: octubre-2007
Mensajes: 17
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: Cálculos con arrays multi-dimensionales

Es decir, que

Código PHP:
if ($fml != 'R' && $fml != 'S' && $fml != 'T' && $fml != 'A' && $fml != 'Q'
es más rápida que

Código PHP:
if (!preg_match('/(R|S|T|A|Q)/'$fml)) 
Voy a probarlo.
  #6 (permalink)  
Antiguo 04/04/2013, 00:29
 
Fecha de Ingreso: octubre-2007
Mensajes: 17
Antigüedad: 16 años, 6 meses
Puntos: 0
Respuesta: Cálculos con arrays multi-dimensionales

Probado.

En la prueba realizada aproximadamente he rebajado unos 5 seg. (de 20 a 15 seg.), pero sigue siendo lento el cálculo.

Etiquetas: arrays
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 12:39.