Foros del Web » Programando para Internet » PHP »

diferencia en arrays

Estas en el tema de diferencia en arrays en el foro de PHP en Foros del Web. tengo dos arrays $uno=array("a","b","c"); $dos=array("a","b"); y necesito obtener un array que sólo contenga las diferencias, por ejemplo: $tres=array("c"); probé con array_diff($uno, $dos); y no logro ...
  #1 (permalink)  
Antiguo 10/11/2008, 11:05
Avatar de exegeses  
Fecha de Ingreso: noviembre-2008
Mensajes: 6
Antigüedad: 15 años, 5 meses
Puntos: 0
diferencia en arrays

tengo dos arrays

$uno=array("a","b","c");
$dos=array("a","b");

y necesito obtener un array que sólo contenga las diferencias, por ejemplo:
$tres=array("c");

probé con array_diff($uno, $dos);

y no logro conseguirlo.
alguno me da una mano?
desde ya, muchas gracias

Marcos
  #2 (permalink)  
Antiguo 10/11/2008, 11:11
Avatar de ferbux  
Fecha de Ingreso: mayo-2007
Ubicación: por ahí intentado ayudar
Mensajes: 823
Antigüedad: 16 años, 11 meses
Puntos: 6
Respuesta: diferencia en arrays

Hola,

Puedes hacer un ciclo he ir checando cuales son los elementos distintos en cada arreglo eh irlos metiendo en otro arreglo.

Saludos!!!
__________________
"Eres grande por que caminas entre gigantes"
  #3 (permalink)  
Antiguo 10/11/2008, 11:18
Avatar de exegeses  
Fecha de Ingreso: noviembre-2008
Mensajes: 6
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: diferencia en arrays

Cita:
Iniciado por ferbux Ver Mensaje
Hola,

Puedes hacer un ciclo he ir checando cuales son los elementos distintos en cada arreglo eh irlos metiendo en otro arreglo.

Saludos!!!
si, ferbux, eso es lo que estoy necesitando hacer.
me darías una mano?

desde ya, gracias
  #4 (permalink)  
Antiguo 10/11/2008, 11:18
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 15 años, 8 meses
Puntos: 105
Respuesta: diferencia en arrays

esta es tu solucion:

Código PHP:
foreach($uno as $v){
  foreach(
$dos as $k){
    if(
$k!=$v)$tres[]=$k;break;
  }

y ya tienes el arreglo tres.... siempre he dicho... por que esperan recibir funciones ya predifinidas por el php y no crean sus propias funciones con una simple logica.....

tu funcion puedes crearla asi:

Código PHP:
function arrayDiferente($uno,$dos){
  foreach(
$uno as $v){
    foreach(
$dos as $k){
      if(
$k!=$v)$tres[]=$k;break;
    }
  }
  return 
$tres;
}

$uno=array("a","b","c");//lleno mi primer array
$dos=array("a","b");//lleno mi segundo array
$tres=arrayDiferente($uno,$dos);//y obtengo mi tercer array con valores distintos 
bueno suerte.

Dios te Bendiga.
__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog
  #5 (permalink)  
Antiguo 10/11/2008, 11:20
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: diferencia en arrays

Porque no mejor usas array_diff?

Saludos.
  #6 (permalink)  
Antiguo 10/11/2008, 11:20
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 8 meses
Puntos: 70
Respuesta: diferencia en arrays

Exegeses, lee bien sobre array

No estás aplicando correctamente la inicialización de los array... por ese motivo no te va a funcionar array_diff

Saludos
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #7 (permalink)  
Antiguo 10/11/2008, 11:21
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 8 meses
Puntos: 70
Respuesta: diferencia en arrays

GatorV, cómo vas??

Es que inicialmente así lo hacía exegeses, pero no está iniciando bien los array si te fijas en su primer post...

Saludos
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #8 (permalink)  
Antiguo 10/11/2008, 11:30
Avatar de ferbux  
Fecha de Ingreso: mayo-2007
Ubicación: por ahí intentado ayudar
Mensajes: 823
Antigüedad: 16 años, 11 meses
Puntos: 6
Respuesta: diferencia en arrays

Si lo quieres hacer manual puedes hacerlo mas o menos asi:

Código:
while ($contador != largo_del_arreglo)
{ 
if (arreglo_a[i]==arreglo_b[i])
{
i++;
}
else
{
   ///guardas el valor diferente en otro arreglo
}
}
O puedes usar la funcion que te indican los compañeros:

$array1 = array ("a" => "verde", "rojo", "azul", "rojo");
$array2 = array ("b" => "verde", "amarillo", "rojo");
$resultado = array_diff ($array1, $array2);
print_r($resultado);


Saludos!!!
__________________
"Eres grande por que caminas entre gigantes"
  #9 (permalink)  
Antiguo 10/11/2008, 11:33
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 15 años, 8 meses
Puntos: 105
Respuesta: diferencia en arrays

Hola Carxl, sabes asi como dicen ustedes que nosotros (principiantes) debemos expresarnos bien y escribir bien, pues tambien ustedes con mayor razon no, en este post mi amigo exegeses pide un apoyo y tu solo mencionas que esta mal iniciado pero no le das la solucion (es decir de como DEBERÍA de iniciarse).

y por que debe de recurrir a la funcion array_diff y no crea su propia logica.....
asi no desarrolla su algoritmo y su logica.... ese es el punto de partida de los paises subdesarrollados...

Saludos...
__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog
  #10 (permalink)  
Antiguo 10/11/2008, 11:37
Avatar de exegeses  
Fecha de Ingreso: noviembre-2008
Mensajes: 6
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: diferencia en arrays

paso todo el código
Código:
<?php

$path="videos";
$arch_base=array();

############################################
$id_con=mysql_connect($server,$usuario_db,$clave_db);
mysql_select_db("listavideos",$id_con);
$consulta="SELECT nombre from lista";
$resultado=mysql_query($consulta);
while($fila=mysql_fetch_array($resultado)){
        
        $arch_base[] = $fila[nombre];// almacenamos videos de la base en un array
        echo($fila[nombre]."<br />");

}

echo("<hr />");
print_r($arch_base); // chequeo
echo("<hr />");
############################################
############################################
echo("<br /><br /> <hr /> Listado de archivos en PHP <hr />");
$dir = opendir($path);
$archivos=array();
while($file = readdir($dir)){
    $archivos[] = $file;
}
    
print_r($archivos);

echo("<br /><hr />veamos los nuevos <hr />");

$archivos_n=array_diff($archivos, $arch_base);
//print_r(array_values($archivos_n));
//print_r($archivos_n);

for($i=0;$i<count($archivos_n);$i++){

    if($archivos_n[$i] != "." || $archivos_n[$i] != ".."){
    
        echo("<strong>$archivos_n[$i]</strong><br />");
    }
    
}

?>
lo que quiero hacer es ver TODOS los archivos en un directorio que NO estén ya ingresados en la base de datos.
lamentablemente no me los muestra todos

ya me tiene a maltraer.
espero esto sirva para aclarar

muchas gracias
  #11 (permalink)  
Antiguo 10/11/2008, 11:44
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 15 años, 8 meses
Puntos: 105
Respuesta: diferencia en arrays

Código PHP:
print_r($archivos);

echo(
"<br /><hr />veamos los nuevos <hr />");

foreach(
$archivos as $v){
  foreach(
$arch_base as $k){
    if(
$k!=$v)$archivos_n[]=$k;break;
  }
}

foreach(
$archivos_n as $v){
    if(
$v!="." || $v!="..") echo("<strong>$v</strong><br />");    

__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog
  #12 (permalink)  
Antiguo 10/11/2008, 11:58
Avatar de Deschamps  
Fecha de Ingreso: octubre-2008
Mensajes: 257
Antigüedad: 15 años, 6 meses
Puntos: 8
Respuesta: diferencia en arrays

Cita:
Iniciado por masterojitos Ver Mensaje
esta es tu solucion:

Código PHP:
foreach($uno as $v){
  foreach(
$dos as $k){
    if(
$k!=$v)$tres[]=$k;break;
  }

Eso no funciona, masterojitos.

Haces un producto cartesiano que lo que va a generar es un montón de entradas duplicadas en el tercer array, cada vez que un elemento del primer array sea distinto a otro del segundo. Basta ejecutarlo para verlo. Para muestra:

Código PHP:
    $a = array( "1""b""c""d" );
    
$b = array( 1"b""d" );
    
    foreach( 
$a as $uno )
        foreach( 
$b as $otro )
            if( 
$uno != $otro $c[]=$uno;
        
    
print_r($c); 
Y su resultado:

Código:
Array
(
    [0] => 1
    [1] => 1
    [2] => b
    [3] => b
    [4] => c
    [5] => c
    [6] => c
    [7] => d
    [8] => d
)
Si por alguna razón no quiere usar array_diff, como ya ha sugerido, y lo quiere implementar "manualmente", entonces un esquema podría ser éste:

Código PHP:
    foreach( $a as $uno )
        if( !
in_array($uno$b) ) $d[]=$uno
Aunque faltaría también comprobar que no son del mismo tipo, porque en este caso está aceptando que 1 (entero) es igual a "1" (string).

Un saludo.
  #13 (permalink)  
Antiguo 10/11/2008, 11:58
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 8 meses
Puntos: 70
Respuesta: diferencia en arrays

Cómo tú digas masterojitos

Exegeses, probaste con array_diff()??

Saludos
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #14 (permalink)  
Antiguo 10/11/2008, 12:02
Avatar de exegeses  
Fecha de Ingreso: noviembre-2008
Mensajes: 6
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: diferencia en arrays

gracias masterojitos por tu respuesta.
lamentablemente imprime más datos de los que realmente hay.

en el directorio "videos" tengo 4 archivos de video
y en la tabla tengo sóloo dos registros que se repinten.
estos son los que no quiero mostrar.

no me funciona correctamente.
imprime el "." y el ".." y además aún falta mostrar un archivo.
sólo muestra uno.

por favor, alguien me ayuda a corregir?
muchas gracias por su ayuda.

Código PHP:
<?php

$path
="videos";
$arch_base=array();

############################################
$id_con=mysql_connect($server,$usuario_db,$clave_db);
mysql_select_db("listavideos",$id_con);
$consulta="SELECT nombre from lista";
$resultado=mysql_query($consulta);
while(
$fila=mysql_fetch_array($resultado)){
        
        
$arch_base[] = $fila[nombre];// almacenamos videos de la base en un array
        
echo($fila[nombre]."<br />");

}

echo(
"<hr />");
print_r($arch_base); // chequeo
echo("<hr />");
############################################
############################################
echo("<br /><br /> <hr /> Listado de archivos en PHP <hr />");
$dir opendir($path);
$archivos=array();
while(
$file readdir($dir)){
    
$archivos[] = $file;
}
    
print_r($archivos);

echo(
"<br /><hr />veamos los nuevos <hr />");

$archivos_n=array_diff($archivos$arch_base);
//print_r(array_values($archivos_n));
echo("<span style='color:#ff0000'>");
print_r($archivos_n);
echo(
"</span><br />");


echo(
"<span style='color:#0000ff'>");
for(
$i=0$i<count($archivos_n); $i++){

    if(
$archivos_n[$i] != "." || $archivos_n[$i] != ".."){
    
        echo(
"<strong>$archivos_n[$i]</strong><br />");
    }
    
}
echo(
"</span><br />");

?>
  #15 (permalink)  
Antiguo 10/11/2008, 12:05
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 15 años, 8 meses
Puntos: 105
Respuesta: diferencia en arrays

hola Deschamps, dos puntos:

1. los codigos que yo posteo y creo el de muchos, los ingreso de la mente, es decir, no los comprubo... por lo mismo que quizas se me escape una que otra cosa pero la logica hiría igual muy bien.

2. en mi codigo le puse un break, para que cuando encuentre el primer valor diferente del segundo array al primero, lo agregue y escape del bucle.... lo cual no lo agregaste a la muestra que me mostraste...

Bueno, no me gusta desviarme del tema... ya que luego sancionan y apesar que ya voy tiempo aca, sigo con puntos negativos jajajaja.

Suerte y que Dios Bendiga a Todos.
__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog
  #16 (permalink)  
Antiguo 10/11/2008, 12:16
Avatar de exegeses  
Fecha de Ingreso: noviembre-2008
Mensajes: 6
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: diferencia en arrays

acabo de hacer esto para chequear:

Código PHP:
<?php
    print_r
($archivos);
    echo(
"<br />");
    
print_r($arch_base);
    echo(
"<br />");
    
print_r($archivos_n);
?>
y lo que me tira es esto:


Código:
Array ( [0] => . [1] => .. [2] => cuatro.mov [3] => dos.mov [4] => tres.mov [5] => uno.mov )
Array ( [0] => tres.mov [1] => cuatro.mov )
Array ( [0] => . [1] => .. [3] => dos.mov [5] => uno.mov )
por algún motivo lo lista bien.
debe ser alguna pavada en mi código.
me darían esta última mano?

desde ya muchas grsacias
  #17 (permalink)  
Antiguo 10/11/2008, 12:18
Avatar de Deschamps  
Fecha de Ingreso: octubre-2008
Mensajes: 257
Antigüedad: 15 años, 6 meses
Puntos: 8
Respuesta: diferencia en arrays

Cita:
Iniciado por masterojitos Ver Mensaje
2. en mi codigo le puse un break, para que cuando encuentre el primer valor diferente del segundo array al primero, lo agregue y escape del bucle.... lo cual no lo agregaste a la muestra que me mostraste...
Tienes razón. Disculpa el despiste. Al copiarlo para mi ejemplo olvidé ese detalle. En cualqueir caso, sigue sin ser válido, y arrojando duplicados (aunque menos de los que detallé inicialmente ;D).

Un saludo :)
  #18 (permalink)  
Antiguo 10/11/2008, 12:21
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 15 años, 8 meses
Puntos: 105
ya mira amigo, esta que se extiende mucho el post y por algo simple....

esta es la solucion y creo ahora que si:

Código PHP:
//cuando estas agregando al segundo array (archivos)... has que no agregue esos dos valores y listo
while($file readdir($dir)) if($file!="." || $file!=".."$archivos[] = $file
Cita:
Iniciado por Deschamps Ver Mensaje
Tienes razón. Disculpa el despiste. Al copiarlo para mi ejemplo olvidé ese detalle. En cualqueir caso, sigue sin ser válido, y arrojando duplicados (aunque menos de los que detallé inicialmente ;D).

Un saludo :)
jaja si, ya probe mi codigo posteado anteriormente, y ya vi los duplicados... es que yo solo recorro el array lo comparo con uno y por eso se duplica por ser distinto al primero.... en fin... seria una validacion un poco mas larga comparandolo con los elementos ya añadidos al tercer arreglo o algo asi....

en fin, tema resuelto y cerrado.

ayi te va todo el codigo arreglado.....

Código PHP:
<?php

$path
="videos";
$arch_base=array();

############################################
$id_con=mysql_connect($server,$usuario_db,$clave_db);
mysql_select_db("listavideos",$id_con);
$consulta="SELECT nombre from lista";
$resultado=mysql_query($consulta);
while(
$fila=mysql_fetch_array($resultado)){
        
        
$arch_base[] = $fila[nombre];// almacenamos videos de la base en un array
        
echo($fila[nombre]."<br />");

}

echo(
"<hr />");
print_r($arch_base); // chequeo
echo("<hr />");
############################################
############################################
echo("<br /><br /> <hr /> Listado de archivos en PHP <hr />");
$dir opendir($path);
$archivos=array();
while(
$file readdir($dir)) if($file!="." || $file!=".."$archivos[] = $file;
    
print_r($archivos);

echo(
"<br /><hr />veamos los nuevos <hr />");

$archivos_n=array_diff($archivos$arch_base);
//print_r(array_values($archivos_n));
echo("<span style='color:#ff0000'>");
print_r($archivos_n);
echo(
"</span><br />");


echo(
"<span style='color:#0000ff'>");
foreach(
$archivos_n as $v) echo("<strong>$v</strong><br />");
echo(
"</span><br />");

?>
Dios os Bendiga.
__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog

Última edición por GatorV; 10/11/2008 a las 12:27
  #19 (permalink)  
Antiguo 10/11/2008, 12:31
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: diferencia en arrays

O en dado caso un poco más oop:
Código php:
Ver original
  1. $files = array();
  2. foreach(new DirectoryIterator('videos') as $file) {
  3.      if(!($file->isDot() || $file->isDir())) {
  4.             $files[] = $file->getFilename();
  5.      }
  6. }

Saludos.
  #20 (permalink)  
Antiguo 10/11/2008, 12:34
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 15 años, 8 meses
Puntos: 105
Respuesta: diferencia en arrays

Hola GatorV,
ayi esta vez.... hace poco habri un hilo preguntando diferencias o nuevas buenas en opp y solo me dijeron que cambiaba al declarar funciones y referencias al usar objetos.

mira ahora como usas esas propiedades para el manejo de directorios. jeje

Bueno ya no sigo que me bajan puntos!!!!

Dios os Bendiga.
__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog
  #21 (permalink)  
Antiguo 10/11/2008, 13:16
Avatar de exegeses  
Fecha de Ingreso: noviembre-2008
Mensajes: 6
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: diferencia en arrays

muchas gracias.

finalmente lo pude resolver.

no habría podido hacerlo sin su ayuda.

el problema estaba acá:

Código PHP:
Array ( [0] => . [1] => .. [3] => dos.mov [5] => uno.mov 
era un array NO consecutivo y por eso no daba bien-
así que simplemente lo corrí con un foreach.

quisiera agradecer el tiempo que le dedican a ayudar a lo que menos sabemos.

espero poder retribuír cuando tenga la oportunidad.

muchas gracias masterojitos por tu dedicación
y simplemente genial el aporte de GatorV dando un enfoque más OOP

no quiero olvidarme de ferbux y de Carxl que entregaron un poco de su tiempo en ayudarme.

muchas gracias nuevamente.
Marcos
  #22 (permalink)  
Antiguo 10/11/2008, 13:37
Avatar de masterojitos  
Fecha de Ingreso: julio-2008
Ubicación: Lima Callao Chucuito
Mensajes: 1.931
Antigüedad: 15 años, 8 meses
Puntos: 105
Respuesta: diferencia en arrays

creo que todos aca somos retribuidos, con las simples alegrias que vemos cuando ayudamos a aquellos que saben un poco menos..... amad para ser amados....
__________________
Atte. MasterOjitos :ojotes:
Todo sobre Programación Web
Las ultimas tendencias en Efectos y Recursos Web: MasterOjitos Blog
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 10:15.