Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 45

Discussione: Confronto di due array

  1. #1

    Confronto di due array

    Ho due matrici: $tables[], $tables_in_DB[]
    La prima matrice che ho in un file di configurazione contiene le tabelle che mi occorrono
    La seconda raccoglie le tabelle che ho nel DB

    Debbo verificare che le due matrici siano perfettamente uguali.
    Per il momento uso questo:
    Codice PHP:
    <?php
    $go 
    "zone_user/index.php";
    for (
    $i =0$i<count($tables); $i++) {
        if(!
    in_array($tables[$i],$tables_in_DB)) {
            
    $go "no_tables/notables_db.php";
        }
    }
    for (
    $i =0$i<count($tables_in_DB); $i++) {
        if(!
    in_array($tables_in_DB[$i],$tables)) {
            
    $go "no_tables/notables_arch.php";
        }
    }
    ?>
    Dopo la verifica voglio che mi sia segnalato in quale matrice manca qualche elemento, oppure che il lavoro continui se le due matrici sono uguali.
    Vorrei sapere se esiste un modo alternativo di effettuare la stessa modifica senza ricorrere a due cicli.

  2. #2
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    cosa intendi per uguali?

    devono avere lo stesso numero di elementi? devono essere ordinate uguali?


    cmq una cosa del genere è equivalente al tuo


    Codice PHP:
    <?php 
    $go 
    "zone_user/index.php"

    $i=0;
    $j=0;
    $entrato=false;
    while((
    $i<count($tables) || $j<count($tables_in_DB)) && !$entrato) {
        if(!
    in_array($tables[$i],$tables_in_DB)) { 
            
    $go "no_tables/notables_db.php"
            
    $entrato=true;
        }
         if(!
    in_array($tables_in_DB[$j],$tables)) { 
            
    $go "no_tables/notables_db.php"
            
    $entrato=true;
        }
        if(
    $i<count($tables))
             
    $i++;
        if(
    $j<count($tables_in_DB))
            
    $j++;

    ?>

  3. #3
    ciao bstefano79
    grazie per la risposta. La testerò immediatamente.
    Comunque le due matrici dovrebbero essere identiche sia come numero di elementi sia come valori contenuti. L'ordine potrebbe enche non essere lo stesso

    Grazie di nuovo

  4. #4
    Utente di HTML.it L'avatar di bstefano79
    Registrato dal
    Feb 2004
    Messaggi
    2,520
    Allora come soluzione non è corretta, ora sono su telefono ma domani guardiamo

  5. #5
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    1- conta gli elementi se sono != allora sono diverse

    2- avvia 1 cicle con annidamento e variabile di controllo (ovviamente ciclo indefinito)

    2.1- sottociclo di controllo del "record" ...

    se devono essere perfettamente identiche hai una funzione in O(n^2) di complessita nel caso peggiore.
    Codice PHP:
    if dimensione array1 != dimensione array2
    then    
        errore
    else
        
    <= 
        
    while !error AND haveElements

            
    //controlla di non essere uscito dall'array
            
    if(  esiste array[i] && esiste array2[i] )
            
    then
                haveElements 
    <= false
            
    else
                
    // confronta i sottoarray
                
    data1 <= array1]
                
    data2 <= array2]

                if( 
    data1 != data2 OR dimensione data1 != dimensione data2 )
                
    then
                    error 
    <= true
                
    else
                    for( 
    j=j<dimensione data1 j++ )
                        if(  
    data1[j]!=data2[j] )
                        
    then
                            error 
    <= true 
                    
    endfor
                endif
            endif
        endwhile
    endif 

    e' la prima idea che mi puo' venire in mente.

  6. #6
    ciao Virus_101 e grazie per l'interessamento.
    Ho tradotto il tuo esempio nella sintassi PHP che uso io in questo modo:
    Codice PHP:
    <?php
    if (count$array1) != count$array2)) {    
        
    $errore =true;
    } else {
        
    $i <= ;
        while (!
    $error AND $haveElements) {
            
    //controlla di non essere uscito dall'array
            
    if(  esiste ($array[$i]) && esiste ($array2[$i] )) {
                
    $haveElements <= false;
            } else {
                
    // confronta i sottoarray
                
    $data1 <= $array1$i ];
                
    $data2 <= $array2$i ];
                if( 
    $data1 != $data2 || dimensione ($data1) != dimensione ($data2) ) {
                    
    $error <= true;
                } else {
                    for( 
    $j=$j<dimensione ($data1) ; $j++ ) {
                        if(  
    $data1[$j]!=$data2[$j] ) {
                            
    $error <= true ;
                        }
                    }
                }
            }
        }
    }
    ?>
    Purtroppo debbo confessare che non ci ho capito molto.
    Non capisco per esempio perchè il $data1 e $data2 vengano trattati come matrice (for( $j=0 ; $j<dimensione ($data1) ; $j++ ) { )
    Secondo me queste 2 variabili contengono semplici stringhe (i nomi delle tabelle)

    Forse debbo spiegarmi meglio con uno schema:
    Codice PHP:
    //prima situazione corretta
    $array1                $array2
    tabella1                tabella1
    tabella2                tabella2
    tabella3                tabella5
    tabella4                tabella4
    tabella5                tabella3

    //seconda situazione anomala (manca una tabella nella seconda matrice)
    $array1                $array2
    tabella1                tabella1
    tabella2                tabella5
    tabella3                tabella4
    tabella4                tabella3
    tabella5                

    //terza situazione anomala (manca una tabella nella prima matrice)
    $array1                $array2
    tabella1                tabella1
    tabella2                tabella2
    tabella4                tabella5
    tabella5                tabella4
                        tabella3

    //quarta situazione anomala (manca una tabella nella prima matrice ed una nella seconda)
    $array1                $array2
    tabella1                tabella1
    tabella3                tabella2
    tabella4                tabella4
    tabella5                tabella3 
    Dalla verifica che eseguo su queste 2 matrici posso uscire con una delle 4 situazioni viste qui sopra.
    Una sola giusta, tutte le altre sbagliate.

    Chiedo scusa per questa replica, ma mi è sembrata necessaria.
    Forse ho sbagliato a non menzionare queste situazioni nel primo post.
    Ma, come si dice, meglio tardi che mai

  7. #7
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Se aprli di matrici parli di array bidimensionali. ossia Array di array.

    tipo

    $array = array(
    array( 1 , 2 , 3 ) ,
    array( 1 , 2 , 3 ) ,
    array( 1 , 2 , 3 )
    )

    Esempio di matrice 3x3.

    Per questo ho impostato un controllo su data1 e data2 in forma di ciclo.
    Se invece tu hai una struttura del tipo :

    $array(
    stringa,
    stringa,
    stringa
    )


    allora togli il ciclo innestato e fai uno str_cmp($data1,$data2)

    inoltre abbassi anche lka complessita da quadratica a lineare.

  8. #8
    Bene, ti ringrazio Virus_101.
    Ora è tutto più chiaro e ci provo

  9. #9
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Aureo ... facci sapere come va

  10. #10
    Grazie dell'"Aureo"

    Ho provato ma non funge.
    Prima posto il codice modificato, poi descrivo alcume prove che ho fatto (nel codice è rimasto qualcosa commentato e dei test - echo - per vedere le porzioni di codice che viene eseguito) ed infine alcune riflessioni

    Codice PHP:
    if (count$tables_in_DB) != count$tables)) {    
        
    $errore true;
        echo 
    "step1
    \n"
    ;
    } else {
        echo 
    "step2
    \n"
    ;
        
    $i <= ;
        while (!
    $errore && $haveElements) {
            echo 
    $i " in step3
    \n"
    ;
    //        controlla di non essere uscito dall'array
            
    if(  table_exists ($tables_in_DB[$i]) && table_exists ($tables[$i] )) {
                
    $haveElements <= false;
                echo 
    $haveElements " in step4
    \n"
    ;
            } else {
    //            confronta gli elementi trovati            
                
    $data1 <= $tables_in_DB$i ];
                
    $data2 <= $tables$i ];
                echo 
    $data1 " e " $data2 " in step5
    \n"
    ;
                if( 
    $data1 != $data2) {
                    echo 
    "step6
    \n"
    ;
                    
    $errore <= true;
                } else {
                    echo 
    "step7
    \n"
    ;
    //                for( $j=0 ; $j<dimensione ($data1) ; $j++ ) {
                    
    echo 'strcmp(): ' strcmp($data1$data2) . '
    '
    ;
                    echo 
    'strcasecmp(): ' strcasecmp($data1a$data2);
                    if(  
    $data1[$j]!=$data2[$j] ) {
                        echo 
    "step8
    \n"
    ;
                        
    $errore <= true ;
                    }
    //                }
                
    }
            }
        }

    echo 
    "All'uscita dal controllo:
    \n"
    ;
    if (
    $errore) {
        echo 
    "ERRORE
    \n"
    ;
    } else {
        echo 
    "NO ERRORE
    \n"
    ;

    Le mie prime prove
    Per testare l'andamento dello script ho messo delle echo stepx
    Quando non ci sono errori mi viene visualizzato lo step2
    Ho provato a generare un errore togliendo prima un elemento dalla prima matrice e poi nell'altra
    In entrambe le prove visualizzo solo lo step1

    riflessioni
    Con le prove che ho fatto ho visto che il ciclo while così impostato non viene mai eseguito

    A tra poco

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.