Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Necesito eliminar lo que coinda en dos arrays

Estas en el tema de Necesito eliminar lo que coinda en dos arrays en el foro de PHP en Foros del Web. Hola a todos y gracias de antemano. tengo dos arrays con numeros: $array1 = array( 2, 2, 3, 5, 7, 13); $array2 = array( 2, ...
  #1 (permalink)  
Antiguo 22/05/2014, 06:30
 
Fecha de Ingreso: mayo-2014
Mensajes: 13
Antigüedad: 5 años, 9 meses
Puntos: 0
Necesito eliminar lo que coinda en dos arrays

Hola a todos y gracias de antemano.

tengo dos arrays con numeros:
$array1 = array( 2, 2, 3, 5, 7, 13);
$array2 = array( 2, 3, 3, 7, 11, 13);

necesito que se borre de cada array lo que coinda es decir mis arrays deberian de quedar asi:

$array1 = array( 2, 5 ); // se debe borrar un dos, un tres, un 7, y un 13
$array2 = array( 3, 11); // y aqui un dos, un 3 (xk arriba solo hay un 3), un 7 y un 13
  #2 (permalink)  
Antiguo 22/05/2014, 06:46
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 11 años, 10 meses
Puntos: 326
Respuesta: Necesito eliminar lo que coinda en dos arrays

¿Y cual ha sido tu intento?

¿Qué has pensado? :D
__________________
>> Eleazan's Source
>> @Eleazan
  #3 (permalink)  
Antiguo 22/05/2014, 07:02
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 11 años, 11 meses
Puntos: 574
Respuesta: Necesito eliminar lo que coinda en dos arrays

El ejemplo no esta mal pero tampoco es una generalización del concepto "coinda", puedes explicarte mejor.

Puedes empezar por aquí http://www.php.net/manual/es/ref.array.php
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #4 (permalink)  
Antiguo 22/05/2014, 07:22
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 12 años, 10 meses
Puntos: 292
Respuesta: Necesito eliminar lo que coinda en dos arrays

Código PHP:
Ver original
  1. <?php
  2.  
  3. $array1 = array( 2, 2, 3, 5, 7, 13);
  4. $array2 = array( 2, 3, 3, 7, 11, 13);
  5.  
  6. $intersec = array_intersect($array1,$array2);
  7.  
  8. foreach ($array1 as $key=>$val)
  9.     if(in_array($val,$intersec)){
  10.         unset($array1[$key]);
  11.         unset($array2[array_search($val,$array2)]);
  12.         echo "Eliminando $val ..<br/>";
  13.     }
__________________
Salu2!
  #5 (permalink)  
Antiguo 22/05/2014, 07:23
 
Fecha de Ingreso: mayo-2014
Mensajes: 13
Antigüedad: 5 años, 9 meses
Puntos: 0
Respuesta: Necesito eliminar lo que coinda en dos arrays

e probao 500 cosas, pero la ultima esta: que no me sirve, mis arrays son dinamicos, en este caso me devuelve:
Array ( [0] => 2 [1] => 3 [2] => 7 )
Array ( [0] => 2 [1] => 2 [2] => 3 [3] => 5 )




$encontrado1=array();
$noencontrado1=array();


foreach($array1 as $valor1){
if (in_array($valor1,$array2))
$encontrado1[]=$valor1;
else
$noencontrado1[]=$valor1;
}

print_r($encontrado1);
echo "<br>";
print_r($noencontrado1); // devuelve: Array ( [0] => 7 ) este sale bien
echo "<br>"; echo "<br>"; echo "<br>";


$encontrado2=array();
$noencontrado2=array();


foreach($array2 as $valor2){
if (in_array($valor2,$array1))
$encontrado2[]=$valor2;
else
$noencontrado2[]=$valor2;
}

print_r($encontrado2);
echo "<br>";
print_r($noencontrado2); // devuelve: Array ( [0] => 5 ) , quiero que me devuelva un dos tambien, porque aqui habia dos doses y en el otro array uno, entonces quiero que me borre solo un dos
  #6 (permalink)  
Antiguo 22/05/2014, 07:35
 
Fecha de Ingreso: mayo-2014
Mensajes: 13
Antigüedad: 5 años, 9 meses
Puntos: 0
Respuesta: Necesito eliminar lo que coinda en dos arrays

Cita:
Iniciado por Italico76 Ver Mensaje
Código PHP:
Ver original
  1. <?php
  2.  
  3. $array1 = array( 2, 2, 3, 5, 7, 13);
  4. $array2 = array( 2, 3, 3, 7, 11, 13);
  5.  
  6. $intersec = array_intersect($array1,$array2);
  7.  
  8. foreach ($array1 as $key=>$val)
  9.     if(in_array($val,$intersec)){
  10.         unset($array1[$key]);
  11.         unset($array2[array_search($val,$array2)]);
  12.         echo "Eliminando $val ..<br/>";
  13.     }

esta respuesta me vale muchisimas gracias, si eres tan amable de explicarmelo linea a linea.

un saludo
  #7 (permalink)  
Antiguo 22/05/2014, 07:41
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 11 años, 11 meses
Puntos: 574
Respuesta: Necesito eliminar lo que coinda en dos arrays

Ojo manual

Cita:
array_intersect handles duplicate items in arrays differently. If there are duplicates in the first array, all matching duplicates will be returned. If there are duplicates in any of the subsequent arrays they will not be returned.

<?php
array_intersect(array(1,2,2),array(1,2,3)); //=> array(1,2,2)
array_intersect(array(1,2,3),array(1,2,2)); //=> array(1,2)
?>
Luego deberías eliminar el valor del array intersección para evitar que se eliminen las repeticiones.

$array1 = array( 2, 2, 3, 5, 7, 13);
$array2 = array( 2, 3, 3, 7, 11, 13);

$intersec = array_intersect($array1,$array2); //$intersec=array(2,2,3,7,13)

$key=0 => $val=2 => $array1 = array( 2, 3, 5, 7, 13); $array2 = array(3, 3, 7, 11, 13); $intersec=array(3,7,13)
$key=1 => $val=2 => $array1 = array( 2, 3, 5, 7, 13); $array2 = array(3, 3, 7, 11, 13); $intersec=array(3,7,13)
$key=2 => $val=3 => $array1 = array( 2, 5, 7, 13); $array2 = array(3, 7, 11, 13); $intersec=array(7,13)
$key=3 => $val=5 => $array1 = array( 2, 5, 7, 13); $array2 = array(3, 7, 11, 13); $intersec=array(7,13)
$key=4 => $val=7 => $array1 = array( 2, 5, 13); $array2 = array(3, 11, 13); $intersec=array(13)
$key=5 => $val=13 => $array1 = array( 2, 5); $array2 = array(3, 11); $intersec=array()


$array1 = array( 2, 5);
$array2 = array(3, 11);


Código PHP:
Ver original
  1. <?php
  2.  
  3. $array1 = array( 2, 2, 3, 5, 7, 13);
  4. $array2 = array( 2, 3, 3, 7, 11, 13);
  5.  
  6. $intersec = array_intersect($array1,$array2);
  7.  
  8. foreach ($array1 as $key=>$val){
  9.     if(in_array($val,$intersec)){
  10.         unset($array1[$key]);
  11.         unset($array2[array_search($val,$array2)]);
  12.         while (array_search($val,$intersec)!==false){
  13.                unset($intersec[array_search($val,$intersec)]);
  14.         }
  15.         echo "Eliminando $val ..<br/>";
  16.     }
  17. }
  18. echo "<pre>";
  19. print_r($array1);
  20. echo "<br />";
  21. print_r($array2);
  22. echo "</pre>";

(Hecho al vuelo)
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 22/05/2014 a las 08:15
  #8 (permalink)  
Antiguo 22/05/2014, 07:43
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 12 años, 10 meses
Puntos: 292
Respuesta: Necesito eliminar lo que coinda en dos arrays

Cita:
Iniciado por quimfv Ver Mensaje
Código PHP:
Ver original
  1. <?php
  2.  
  3. $array1 = array( 2, 2, 3, 5, 7, 13);
  4. $array2 = array( 2, 3, 3, 7, 11, 13);
  5.  
  6. $intersec = array_intersect($array1,$array2);
  7.  
  8. foreach ($array1 as $key=>$val)
  9.     if(in_array($val,$intersec)){
  10.         unset($array1[$key]);
  11.         unset($array2[array_search($val,$array2)]);
  12.         unset($intersec[array_search($val,$intersec)]);
  13.         echo "Eliminando $val ..<br/>";
  14.     }

De esta manera solo se eleiminara el primer 2....

Pero si defines mejor en que casos los elementos "coindan" se podrá mejorar el script, o darlo por bueno.
Esta SEGURO ?

Lo cierto es que el problema no esta 100% definido.... asi el resultado cambia si se intercambian $array1 con $array2 y obviamente si se hace:

Código PHP:
Ver original
  1. $array1 =array_unique($array1);
  2. $array2 =array_unique($array2);

... porque hay elementos repetidos DENTRO de cada arreglo...y no se define que hacer con ellos
__________________
Salu2!

Última edición por Italico76; 22/05/2014 a las 07:52
  #9 (permalink)  
Antiguo 22/05/2014, 08:20
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 11 años, 11 meses
Puntos: 574
Respuesta: Necesito eliminar lo que coinda en dos arrays

Cita:
Pero si defines mejor en que casos los elementos "coindan" se podrá mejorar el script, o darlo por bueno.
He modificado el post, sin hacer pruebas pero veo bastante claro que se eliminarían los dos 2 del primer array, si no se van eliminando los valores de la intersección.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #10 (permalink)  
Antiguo 22/05/2014, 08:31
 
Fecha de Ingreso: mayo-2014
Mensajes: 13
Antigüedad: 5 años, 9 meses
Puntos: 0
Respuesta: Necesito eliminar lo que coinda en dos arrays

yo lo que necesitaba era eliminar de los arrays lo que se repita entre ellos otro ejemplo:

$array1 = array( 5, 7, 7); // --> $array1 = array(7);
$array2 = array( 2, 5, 5, 7, 11, 13); // --> $array2 = array( 2, 5, 11, 13);


como ves en el array1 hay dos 7 y abajo solo hay uno, quiero que se elimine un 7 de cada array. con los cinco pasa lo mismo a la inversa.
  #11 (permalink)  
Antiguo 22/05/2014, 08:38
Avatar de alexisverano  
Fecha de Ingreso: septiembre-2008
Ubicación: La Habana.Cuba
Mensajes: 298
Antigüedad: 11 años, 5 meses
Puntos: 36
Respuesta: Necesito eliminar lo que coinda en dos arrays

joseantoniogf1, si marcastes el post SOLUCIONADO, seria bueno que nos mostraras la solucion final. recuerda que esto es un FORO y las respuestas concluyente pueden ayudar a muchos en cualquier momento.
  #12 (permalink)  
Antiguo 22/05/2014, 08:39
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 11 años, 11 meses
Puntos: 574
Respuesta: Necesito eliminar lo que coinda en dos arrays

Con la nueva definición, haría esto

Código PHP:
Ver original
  1. <?php
  2.  
  3. $array1 = array( 2, 2, 3, 5, 7, 13);
  4. $array2 = array( 2, 3, 3, 7, 11, 13);
  5.  
  6. $intersec = array_intersect($array1,$array2);//$intersec=array(2,2,3,7,13)
  7. $intersec = array_unique($intersec);//$intersec=array(2,3,7,13)
  8.  
  9. foreach ($intersec as $key=>$val)
  10.         unset($array1[array_search($val,$array1)]);
  11.         unset($array2[array_search($val,$array2)]);
  12.         echo "Eliminando $val ..<br/>";
  13.     }
  14. echo "<pre>";
  15. print_r($array1);
  16. echo "<br />";
  17. print_r($array2);
  18. echo "</pre>";

Se eliminará la primera aparición de los valores de la intersección, sin duplicados.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #13 (permalink)  
Antiguo 22/05/2014, 08:42
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 11 años, 10 meses
Puntos: 326
Respuesta: Necesito eliminar lo que coinda en dos arrays

Yo supongo que algo así valdrá:
Código PHP:
$array1 = array(...);
$array2 = array(...);

foreach(
$array1 as $key=>$value) {
    
$key2array_search($value$array2);
    if(
$key2 !== false) { unset($array2[$key2]); unset($array1[$key]);

Supongo que algo así valdría :D

Creo q el funcionamiento es sencillo, y obvio!
Saludos ^^

(en caso de no saber qué hace una función, mira primero en el manual!)
__________________
>> Eleazan's Source
>> @Eleazan
  #14 (permalink)  
Antiguo 22/05/2014, 16:56
 
Fecha de Ingreso: mayo-2014
Mensajes: 13
Antigüedad: 5 años, 9 meses
Puntos: 0
Respuesta: Necesito eliminar lo que coinda en dos arrays

crei que ya estaba solucionado pero me sigue haciendo cosas que no esperaba. haber me explicare, tengo hecho un programa que el usuario le mete una serio de valores los que sean... y yo e hecho un programa para que cree un array con la descomposicion en numeros primos de dos numeros, es decir si el resultado es 32/30 los arrays quedarian asi:
array1 = (2, 2, 2, 2, 2);
array2 = (2, 3, 5);

con estos arrays quiero sacar el maximo comun divisor, para ello necesito eliminar eliminar lo que se repita entre los dos arrays. lo unico que se repite en este caso es un 2. pues eliminaria y quedaria asi:
array1 = (2, 2, 2, 2);
array2 = (3, 5);

que luego los multiplico entre si y me daria de resultado 16/15 para que entendais quiero que me simplifique una fraccion
  #15 (permalink)  
Antiguo 22/05/2014, 17:18
 
Fecha de Ingreso: mayo-2014
Mensajes: 13
Antigüedad: 5 años, 9 meses
Puntos: 0
Respuesta: Necesito eliminar lo que coinda en dos arrays

Cita:
Iniciado por joseantoniogf1 Ver Mensaje
crei que ya estaba solucionado pero me sigue haciendo cosas que no esperaba. haber me explicare, tengo hecho un programa que el usuario le mete una serio de valores los que sean... y yo e hecho un programa para que cree un array con la descomposicion en numeros primos de dos numeros, es decir si el resultado es 32/30 los arrays quedarian asi:
array1 = (2, 2, 2, 2, 2);
array2 = (2, 3, 5);

con estos arrays quiero sacar el maximo comun divisor, para ello necesito eliminar eliminar lo que se repita entre los dos arrays. lo unico que se repite en este caso es un 2. pues eliminaria y quedaria asi:
array1 = (2, 2, 2, 2);
array2 = (3, 5);

que luego los multiplico entre si y me daria de resultado 16/15 para que entendais quiero que me simplifique una fraccion
ahora mismo lo tengo asi:



$intersec = array_intersect($descomNumerador,$descomDenominado r);

foreach ($descomNumerador as $key=>$val)
if(in_array($val,$intersec)){
unset($descomNumerador[$key]);
unset($descomDenominador[array_search($val,$descomDenominador)]);

}

me e fijado que si los arrays vienen con:
$descomNumerador= array( 2, 2, 2, 2, 2);
$descomDenominador= array( 2, 3, 5);

me los devuelve asi:
$descomNumerador= array( );
$descomDenominador= array( 3, 5);


cuando el resultado quiero que sea:
$descomNumerador= array( 2, 2, 2, 2);
$descomDenominador= array( 3, 5);
  #16 (permalink)  
Antiguo 23/05/2014, 01:43
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 11 años, 11 meses
Puntos: 574
Respuesta: Necesito eliminar lo que coinda en dos arrays

Lee todos los posts, no te quedes con la primera solución. La última mia o la de @Eleazan funcionan. La primera de @Italico elimina todas las repeticiones ya lo comente.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

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 03:35.