Foros del Web » Programando para Internet » PHP »

Comparar arrays

Estas en el tema de Comparar arrays en el foro de PHP en Foros del Web. Hola, Os cuento mi situación a ver si algún iluminado consigue alguna forma de solucionar mi problema. Estoy haciendo un sistema de facturación, con productos, ...
  #1 (permalink)  
Antiguo 01/02/2013, 06:56
 
Fecha de Ingreso: octubre-2011
Mensajes: 6
Antigüedad: 12 años, 6 meses
Puntos: 1
Comparar arrays

Hola,

Os cuento mi situación a ver si algún iluminado consigue alguna forma de solucionar mi problema.

Estoy haciendo un sistema de facturación, con productos, periodos de los productos (duración), precio, etc.

El asunto es el siguiente, tengo varios arrays dobles ($paymentdate[$i][$e], $periodstart[$i][$e], $periodend[$i][$e], $price[$i][$e], $rep[$i][$e]; donde $i es el número de producto y $e es la entrada: una por cada mes de periodo del producto).

Lo que necesito es que se pisen entre si los meses, es decir, si por ejemplo en el producto 1, periodo 1 (que empieza en febrero), coincide con el producto 2, periodo 1 (que también empiece en febrero), que el resultado a mostrar sea la suma de los dos precios.

Actualmente lo que tengo es lo siguiente:
Código:
$dates = array();
echo tab(0).'<table class="coverage">';
for ($pr1 = 1; $pr1 < ($count+1); $pr1++) {
	for ($re1 = 0; $re1 < $result; $re1++) {
		for ($pr2 = 1; $pr2 < ($count+1); $pr2++) {
			for ($re2 = 0; $re2 < $result; $re2++) {
				if ($pr1 !== $pr2) {
					if (!in_array($_paymentdate[$pr1][$re1],$dates)) {
						if ($_paymentdate[$pr1][$re1] == $_paymentdate[$pr2][$re2]) {
							array_push($dates,$_paymentdate[$pr1][$re1]);
							echo '<tr><td>1 - '.$_paymentdate[$pr1][$re1].'</td><td>'.$_periodstart[$pr1][$re1].' - '.$_periodend[$pr1][$re1].'</td><td>'.($_price[$pr1][$re1]+$_price[$pr2][$re2]).'</td></tr>';
						} elseif ($_paymentdate[$pr1][$re1] < $_paymentdate[$pr2][$re2]) {
							array_push($dates,$_paymentdate[$pr1][$re1]);
							echo '<tr><td>2 - '.$_paymentdate[$pr1][$re1].'</td><td>'.$_periodstart[$pr1][$re1].' - '.$_periodend[$pr1][$re1].'</td><td>'.$_price[$pr1][$re1].'</td></tr>';
						} elseif ($_paymentdate[$pr1][$re1] > $_paymentdate[$pr2][$re2]) {
							array_push($dates,$_paymentdate[$pr1][$re1]);
							echo '<tr><td>3 - '.$_paymentdate[$pr1][$re1].'</td><td>'.$_periodstart[$pr1][$re1].' - '.$_periodend[$pr1][$re1].'</td><td>'.$_price[$pr1][$re1].'</td></tr>';
						}
					}
				}
			}

		}
	}
}
Problema: si una fecha de inicio del segundo producto es más pequeña o más grande que la del primer producto (que va a pasar siempre, ya que el segundo bucle pasa dos veces por una del primero), entra en ese if, añade la fecha en $dates y ya no escribirá más una entrada con esa fecha.

La explicación no es muy clara, así que si alguien quiere ayudar y no entiende alguna cosa, que pregunte. Intentaré aclararle lo que necesite.

Un saludo y gracias.
  #2 (permalink)  
Antiguo 01/02/2013, 10:11
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Comparar arrays

Primero al ser un array multiple lo mejor sería trabajar con funciones recursivas te recomiendo una búsqueda bajo esos terminos para que veas como lograrlo. Pero sinceramente es un poco complicado entender lo que deseas lograr. Podrías mejor colocar ejemplos de lo que tienes y que deseas lograr, no tiene que ser código sino resultados.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 01/02/2013, 10:39
 
Fecha de Ingreso: octubre-2011
Mensajes: 6
Antigüedad: 12 años, 6 meses
Puntos: 1
Respuesta: Comparar arrays

Gracias por contestar.

Es difícil de explicar, la verdad.

Os pongo una imagen, que imagino que se entenderá mejor.



Puede que sean 2 productos, como en la imagen que os he puesto, pero también pueden ser 3 o más. Además de que no tienen porqué coincidir las fechas de pago ($paymentdate) de los productos. Un producto puede tener un periodo del 02/03/2013 hasta 24/03/2013 y otro producto en el mismo listado puede tenerlo del 05/05/2013 hasta el 29/08/2013. En este caso no se sumarían ninguna de las entradas, ya que no coinciden en ningún caso.

Aclaración: las fechas que he puesto son aleatorias.

Última edición por hcanovas; 01/02/2013 a las 10:47 Razón: Añadir información
  #4 (permalink)  
Antiguo 01/02/2013, 11:22
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Comparar arrays

Ok ahora se entiende mucho mejor, es algo simple si modificas el array, lo que puedes hacer es recorrer el array que recibes los datos y crear otro array con los valores que quieres, es decir creas otro array con este tipo de estructura
Código PHP:
Ver original
  1. <?php
  2. /**
  3.  * Debes convertilo de esta forma
  4.  */
  5. $values     = array(
  6.     '2013-01-01' => array(
  7.         '10.99',
  8.         '12.97',
  9.     ),
  10.     '2013-01-02' => array(
  11.         '1.99',
  12.         '3.99',
  13.     ),
  14. );
  15. $finalValues = array();
  16.  
  17. /**
  18.  * Luego lo recorres de esta forma
  19.  */
  20. foreach ($values as $k => $v) {
  21.     $finalValues[$k] = array_sum($v);
  22. }
  23.  
  24. var_dump($finalValues);
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #5 (permalink)  
Antiguo 01/02/2013, 11:40
 
Fecha de Ingreso: octubre-2011
Mensajes: 6
Antigüedad: 12 años, 6 meses
Puntos: 1
Respuesta: Comparar arrays

Muchas gracias de nuevo por guiarme y contestar.

Bueno, ahora mismo tengo todas las entradas en un mismo array, a partir de
Código:
foreach ($_paymentdate as $_paymentdate_merged) {
	array_merge($_paymentdate_merged);
}
Pero la verdad es que no se cómo continuar.
  #6 (permalink)  
Antiguo 01/02/2013, 12:04
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Comparar arrays

Solo es cuestión de recorrer los array que uniste y formar el array que te indiqué, luego haces el resto que te mostré.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #7 (permalink)  
Antiguo 01/02/2013, 12:10
 
Fecha de Ingreso: octubre-2011
Mensajes: 6
Antigüedad: 12 años, 6 meses
Puntos: 1
Respuesta: Comparar arrays

Sí, la teoría la sé, pero no consigo hacerlo.

Ahora mismo estoy probando esto, con resultados fallidos:

Código:
foreach ($_paymentdate as $_paymentdate_merged) {
	array_merge($_paymentdate_merged);
}


for ($pr1 = 0; $pr1 < count($_paymentdate_merged); $pr1++) {
	for ($pr2 = 0; $pr2 < count($_paymentdate); $pr2++) {
		$pos = array_search($_paymentdate_merged[$pr1],$_paymentdate[$pr2]);
		if ($pos) {
			array_push($_paymentdate_merged[$pr1],$_price[$pr2][$pos]);
		}
	}
}
  #8 (permalink)  
Antiguo 01/02/2013, 12:21
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Comparar arrays

Para que te puedas desenvolver, trata de hacerlo usando var_dump para que veas que es lo que estás obteniendo. Es la forma como yo hago. No te puedo ayudar mucho porque no conozco la estructura de array. Solo es cuestión de ir parseando y viendo el resultado.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #9 (permalink)  
Antiguo 01/02/2013, 13:57
 
Fecha de Ingreso: octubre-2011
Mensajes: 6
Antigüedad: 12 años, 6 meses
Puntos: 1
Respuesta: Comparar arrays

Vale, tras unas cuantas horas, tengo el código hecho, pero me acabo de dar cuenta de que lo que creí que tenía conseguido primero, está erróneo.

array_merge() une dos o más arrays, empezando por el que primero indiques, por lo que este código:

Código:
foreach ($_paymentdate as $_paymentdate_merged) {
	array_merge($_paymentdate_merged);
}
No es correcto. Ejemplo gráfico:



En este ejemplo estoy perdiendo las entradas de los meses 03, 04 y 05. Además de que para el mes 06 no realiza la suma correctamente (el contenido del array es erróneo).

¿Existe alguna forma de combinar uno o más arrays que no sea array_merge() y que me pueda servir en este caso?

Muchas gracias.
  #10 (permalink)  
Antiguo 01/02/2013, 14:04
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Comparar arrays

Eso es correcto, debes modificar las llaves para que sean diferentes y al unir se puedan ver.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #11 (permalink)  
Antiguo 02/02/2013, 11:50
 
Fecha de Ingreso: octubre-2011
Mensajes: 6
Antigüedad: 12 años, 6 meses
Puntos: 1
Respuesta: Comparar arrays

Conseguido. Paso el código por si a alguien le interesa, aunque mis arrays no están hechos como convencionalmente debería ser:

Código:
for ($e = 0; $e < count($_paymentdate)+1; $e++) {
	foreach ($_paymentdate[$e] as $_paymentthis) {
		array_push($_paymentdate_merged, $_paymentthis);
	}
}
$_paymentdate_merged = array_values(array_diff(array_unique($_paymentdate_merged), array('')));
	
for ($pr1 = 0; $pr1 < count($_paymentdate_merged); $pr1++) {
	$newarray[$_paymentdate_merged[$pr1]] = array();
	for ($pr2 = 0; $pr2 <= count($_paymentdate); $pr2++) {
		if (in_array($_paymentdate_merged[$pr1],$_paymentdate[$pr2])) {
			array_push($newarray[$_paymentdate_merged[$pr1]],$_price[$pr2][array_search($_paymentdate_merged[$pr1],$_paymentdate[$pr2])]);
		}
	}
}
echo tab(0).'<p style="margin:10px 0px 0px"><b>'.Datespayment.'</b></p>';

echo tab(0).'<table class="coverage">';

$i = 0;
foreach ($newarray as $k => $v) {
    $finalValues[$k] = array_sum($v);
	echo '<tr><td>'.$_paymentdate_merged[$i].'</td><td style="text-align:right">'.number_format($finalValues[$k],2).'&euro;</td></tr>';
	$i++;
}


echo tab(0).'</table>';
Muchas gracias abimaelrc

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 08:44.