Foros del Web » Programando para Internet » PHP »

Comparar campos

Estas en el tema de Comparar campos en el foro de PHP en Foros del Web. Hola a Tod@s De nuevo recurro a vuestra ayuda para resolver un problema. Tengo una BD con una serie de tablas y en cada tabla ...
  #1 (permalink)  
Antiguo 21/07/2003, 13:30
Avatar de Torus  
Fecha de Ingreso: enero-2002
Ubicación: Tú buscame y me encontraras
Mensajes: 413
Antigüedad: 22 años, 3 meses
Puntos: 0
Pregunta Comparar campos

Hola a Tod@s
De nuevo recurro a vuestra ayuda para resolver un problema.
Tengo una BD con una serie de tablas y en cada tabla unos campos
El siguiente codigo lo que hace es imprimir el nombre de la tabla $tabla_nombres[$i] y sus campos correspondientes $nombres_campos[$c]

Código PHP:
mysql_connect(localhost,root,''); 
$db "BasedeDatos";
$result mysql_list_tables ($db);
$i 0;
        while (
$i mysql_num_rows ($result)) {
   
$tabla_nombres[$i] = mysql_tablename ($result$i);
            
$i++;
          } 
  
$i 0;
          while (
$i mysql_num_rows ($result)) {
 
        echo 
$tabla_nombres[$i]."<br>";//Imprime el nombre de la tabla
        
    
$campos mysql_list_fields($db$tabla_nombres[$i]);
    
$columnas mysql_num_fields($campos);
$c 0;
        while (
$c $columnas){
    
$nombres_campos[$c]= mysql_field_name($campos$c) ; 

        echo 
$nombres_campos[$c]."<br>";// imprime el nombre de los campos

 
$c++; 
  }
 
$i++;   
    } 
Pero lo que pretendo es que se pueda comparar los campos de todas las tablas para ver si alguno de ellos se repite y en que tabla se repite.
No se si me explicado bien
He tratado de hacer lo que sigue pero me da campos que no estan repetidos.
Código PHP:
$array_destino=array();
foreach (
$nombres_campos as $valor){
   if (!
in_array($valor,$array_destino)){
      
$array_destino[]=$valor;
   }
}

// ejemplo Leer el array generado ..
foreach ($array_destino as $valor){
echo 
"este campo esta repetido  ".$valor."<br>";

¿Como puedo hacerlo?
Saludos cordiales
__________________
Hay tanto que aprender y tan poco tiempo

Última edición por Torus; 21/07/2003 a las 15:39
  #2 (permalink)  
Antiguo 21/07/2003, 16:06
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
Hola,

No estoy seguro de haber entendido perfectamente el problema, aunque me parece bastante interesante, de modo que he intentado implementar una solución. Me parece que algo como esto podría serte útil (habiendo modificado un poco el código original que has escrito):

Código:
<?php

mysql_connect ('localhost', 'root', ''); 

$db = "BasedeDatos";

$result = mysql_list_tables ($db);

$i = 0;
while ($i < mysql_num_rows ($result)) {
    $tabla_nombres[$i] = mysql_tablename ($result, $i);
    $i++;

} 

$cant_tablas = $i;

print "<h3>Tablas</h3>\n<ul>\n";


// Para llevar un registro de los campos que el programa recupera,
// usaremos un arreglo asociativo.
$campos_recibidos = array ();


$i = 0;
while ($i < $cant_tablas) {
    // Imprime el nombre de la tabla
    echo '<li>' . $tabla_nombres[$i] . "\n<ul>\n";

    $campos = mysql_list_fields ($db, $tabla_nombres[$i]);

    $c = 0;
    while ($c < mysql_num_fields($campos)) {
        $nombres_campos[$c] = mysql_field_name ($campos, $c) ; 

        if (isset ($campos_recibidos[$nombres_campos[$c]]))
            array_push ($campos_recibidos[$nombres_campos[$c]],
                        $tabla_nombres[$i]);
        else
            $campos_recibidos = array_merge ($campos_recibidos,
                                             array (
                                                 $nombres_campos[$c] =>
                                                 array ($tabla_nombres[$i])
                                                 ));

        // Imprime el nombre de los campos
        echo '<li>' . $nombres_campos[$c] . "</li>\n";

        $c++; 
    }

    print "</ul></li>\n";

    $i++;   
}
print "</ul>\n";

reset ($campos_recibidos);
while (list ($nombre, $tablas) = each ($campos_recibidos)){
    $cantidad = count ($tablas);

    if ($cantidad > 1) {
        print "Existe un campo llamado $nombre en las siguientes tablas:\n";
        print "<ul>\n";
        for ($i = 0; $i < $cantidad; $i++)
            print '<li>' . $tablas[$i] . "</li>\n";
        print "</ul><br />\n";
    }
}

?>
Esta solución básicamente utiliza un arreglo asociativo, en el que las llaves corresponden a los nombres de los campos que tienen tus tablas. Y para cada una de estas llaves se define un arreglo con los nombres de las tablas que contienen un campo con ese nombre.

De este modo, al final lo que se hace es observar cuáles de esos arreglos tienen más de un elemento (es decir, cuáles campos están en más de una tabla) y se imprime el resultado. Espero que sea algo similar a lo que estás necesitando.

La solución que se te ha ocurrido y has escrito tiene elementos interesantes, pero eventualmente falla porque parte del contenido del arreglo $nombres_campos, y si te das cuenta, éste arreglo cambia cada vez que procesas una tabla. Creo que con lo que debes resultar es una lista de los campos que tiene la última tabla que el programa procesó (o incluso puede listar campos de otras tablas, si hay tablas con una mayor cantidad de campos que esa última tabla).

Por último, quería tan solo decirte que la frase que usas como firma es muy bonita... es de las pocas firmas que me han parecido interesantes en alguna forma. :) Saludos.
  #3 (permalink)  
Antiguo 21/07/2003, 17:04
Avatar de Torus  
Fecha de Ingreso: enero-2002
Ubicación: Tú buscame y me encontraras
Mensajes: 413
Antigüedad: 22 años, 3 meses
Puntos: 0
!BRAVO¡ leonardop eso es lo que queria.
Te agradezco tu inestimable ayuda, tengo que leer y practicar mas sobre los arrays.
Referente a la firma Gracias, es como lo siento tengo mucho que aprender y una sola vida es poco tiempo .

De nuevo !BRAVO¡
Un cordial saludo
__________________
Hay tanto que aprender y tan poco tiempo
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 22:13.