differenze tra array con subarray

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
darkstaring
Linux 3.x
Linux 3.x
Messaggi: 657
Iscritto il: mer 13 ott 2010, 13:55
Nome Cognome: Francesco Achenza
Desktop: KDE
Distribuzione: Arch Linux
Contatta:

differenze tra array con subarray

Messaggio da darkstaring »

Buongiorno !
Sto facendo una funzione che confronta 2 array generati con questa funzione

Codice: Seleziona tutto

    private function ReadFolderDirectory($dir,$stringa_da_eliminare,$listDir= array())
    {
        $v_esclusioni = array('Gestionale_documents', 'Gestionale_images', 'Upload', 'uploads');
        $listDir = array();
        if($handler = opendir($dir))
        {
            //print "<h1>$dir</h1>";
            if(!in_array(str_replace("./", "", $dir), $v_esclusioni))
            {
                while (($sub = readdir($handler)) !== FALSE)
                {
                    if ($sub != "." && $sub != ".." && $sub != "Thumb.db")
                    {
                        if(is_file($dir."/".$sub))
                        {
                            //$contenuto .= "F\t".$dir."/".$sub."\n";
                            //$listDir['nome_file'] = $sub;
                            //$listDir['md5_file'] = md5_file($dir."/".$sub);
                            $path=str_replace("$stringa_da_eliminare", "", $dir."/".$sub);
                            $listDir['elemento']= array('nome_file' => $sub, 'md5_file' => md5_file($dir."/".$sub), 'path' => $path);
                        }
                        elseif(is_dir($dir."/".$sub))
                        {
                            //$contenuto .="D\t".$dir."/".$sub."\n";
                            if($dir!='./')
                            {
                                $listDir[$sub] = $this->ReadFolderDirectory($dir."/".$sub, $stringa_da_eliminare);
                            }
                            else
                            {
                                $listDir[$sub] = $this->ReadFolderDirectory($dir.$sub, $stringa_da_eliminare);
                            }
                        }
                    }
                }    
                closedir($handler);
            }
        }
        return $listDir;    
    }
che chiamo cosi':
$vecchi_file = $this->ReadFolderDirectory('./IL-PATH-DELLA-DIR', './IL-PATH-DELLA-DIR');
e un altro server con la stessa funzione mi spedisce un json con lo stesso array..
ma se volete aiutarmi potete fare $nuovi_file = $this->ReadFolderDirectory('./IL-PATH-DELLA-DIR2', './IL-PATH-DELLA-DIR2');

Ora devo confrontare i due array, specialmente tenendo conto di md5_file....
Se avete tempo di aiutarmi provate a copiare una directory con sotto-directory e provate a modificare un file sulla directory copiata...lanciate la funzione che genera i due array (qui sopra)
e provate a confrontarli...
io sono 2 giorni che ci provo...sembra semplice... ma non lo e', per via delle sotto directory...

Io nel frattempo continuo a provarci :o

Grazie...

Avatar utente
darkstaring
Linux 3.x
Linux 3.x
Messaggi: 657
Iscritto il: mer 13 ott 2010, 13:55
Nome Cognome: Francesco Achenza
Desktop: KDE
Distribuzione: Arch Linux
Contatta:

Re: differenze tra array con subarray

Messaggio da darkstaring »

Non ci ho potuto dedicare molto tempo ma mi sono reso conto di un errore... non genero correttamente la struttura delle directory!
sbagliavo chiamando ricorsivamente la funzione e dandola a $listDir['elemento'] invece di $listDir['elemento'][].. cosi' mi salvava solo l'ultimo valore che trovava..
Quindi la funzione corretta e' questa:

Codice: Seleziona tutto

  
    private function ReadFolderDirectory($dir,$stringa_da_eliminare,$listDir= array())
    {
        $v_esclusioni = array('Gestionale_documents', 'Gestionale_images', 'Upload', 'uploads');
        $listDir = array();
        if($handler = opendir($dir))
        {
            //print "<h1>$dir</h1>";
            if(!in_array(str_replace("./", "", $dir), $v_esclusioni))
            {
                while (($sub = readdir($handler)) !== FALSE)
                {
                    if ($sub != "." && $sub != ".." && $sub != "Thumb.db")
                    {
                        if(is_file($dir."/".$sub))
                        {
                            //$contenuto .= "F\t".$dir."/".$sub."\n";
                            //print $dir."/".$sub."<br>";
                            //$listDir['nome_file'] = $sub;
                            //$listDir['md5_file'] = md5_file($dir."/".$sub);
                            $path=str_replace("$stringa_da_eliminare", "", $dir."/".$sub);
                            $listDir['elemento'][]= array('nome_file' => $sub, 'md5_file' => md5_file($dir."/".$sub), 'path' => $path);
                        }
                        elseif(is_dir($dir."/".$sub))
                        {
                            //$contenuto .="D\t".$dir."/".$sub."\n";
                            if($dir!='./')
                            {
                                $listDir[$sub] = $this->ReadFolderDirectory($dir."/".$sub, $stringa_da_eliminare);
                            }
                            else
                            {
                                $listDir[$sub] = $this->ReadFolderDirectory($dir.$sub, $stringa_da_eliminare);
                            }
                        }
                    }
                }    
                closedir($handler);
            }
        }
        return $listDir;    
    }
e confronto i 2 array con qust'altra funzione:

Codice: Seleziona tutto

    private function array_diff_assoc_recursive ($array1,$array2)
    {
    $difference = NULL;
    foreach($array1 as $key => $value)
    {
        if(is_array($value))
        {
            if(!array_key_exists($key, $array2))
            {
                $difference[$key] = $value;
            }
            elseif(!is_array($array2[$key]))
            {
                $difference[$key] = $value;
            }
            else
            {
                $new_diff = $this->array_diff_assoc_recursive($value, $array2[$key]);
                if($new_diff != FALSE)
                {
                    $difference[$key] = $new_diff;
                }
            }
        }
        elseif(!array_key_exists($key, $array2) || $array2[$key] != $value)
        {
            $difference[$key] = $value;
        }
    }
    return !isset($difference) ? 0 : $difference;
    }
    
Ora l'array che contiene i file modificati, anzi solo l'md5 risulta simile a questo:

Codice: Seleziona tutto

Array ( [controllers] => Array ( [elemento] => Array ( [12] => Array ( [md5_file] => ad266b9bf77c2cd292d29fa721d06531 ) [24] => Array ( [md5_file] => 331aafc4bfe286f8ee587baeb2485c30 ) ) ) ) 
modificando 2 file..ora devo solo ottenere i nomi e i path dei file ed ho fatto! :D

Avatar utente
darkstaring
Linux 3.x
Linux 3.x
Messaggi: 657
Iscritto il: mer 13 ott 2010, 13:55
Nome Cognome: Francesco Achenza
Desktop: KDE
Distribuzione: Arch Linux
Contatta:

Re: differenze tra array con subarray

Messaggio da darkstaring »

darkstaring ha scritto:

Codice: Seleziona tutto

Array ( [controllers] => Array ( [elemento] => Array ( [12] => Array ( [md5_file] => ad266b9bf77c2cd292d29fa721d06531 ) [24] => Array ( [md5_file] => 331aafc4bfe286f8ee587baeb2485c30 ) ) ) ) 
Mi sapete dire come posso estrapolare solo i valori con chiave md5sum..

Il problema e' che non so' a che livello di " sotto - array " ci siano i valori....credo l'ideale sia una funzione ricorsiva
ma non sto riuscendo a farla...

Mi sapete aiutare?...
Grazie
Francesco

Avatar utente
darkstaring
Linux 3.x
Linux 3.x
Messaggi: 657
Iscritto il: mer 13 ott 2010, 13:55
Nome Cognome: Francesco Achenza
Desktop: KDE
Distribuzione: Arch Linux
Contatta:

Re: differenze tra array con subarray

Messaggio da darkstaring »

Ho risolto creando un array globale e questo codice:

Codice: Seleziona tutto

    private function popola_my_array($vett)
    {
        global $my_array;
        if(is_array($vett))
        {
            foreach($vett as $key => $value)
            {
                if(is_array($value))
                {
                $this->popola_my_array($value);
                }
                else
                {
                    //print "<br>trovo $value<br>";
                    $this->$my_array[] = $value;
                }
            }
        }
        else
        {
                    //print "<br>trovo $value<br>";
                    $this->$my_array[] = $value;
        }
        
        //return $this->$my_array;
    }

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: differenze tra array con subarray

Messaggio da targzeta »

Potevi anche specificare il linguaggio usato, no? Ad occhio e croce sembra PHP.

Cosa dovevi fare alla fine? Perché partivi da quella funzione? Magari dicendoci l'obiettivo potevamo aiutarti meglio.

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
darkstaring
Linux 3.x
Linux 3.x
Messaggi: 657
Iscritto il: mer 13 ott 2010, 13:55
Nome Cognome: Francesco Achenza
Desktop: KDE
Distribuzione: Arch Linux
Contatta:

Re: differenze tra array con subarray

Messaggio da darkstaring »

Sii.. e' php...
L'idea e' stata bocciata dal mio capo... era una funzione che faceva dialogare due server per sincronizzare il codice php, e' trutto pronto
in pratica il server "client" chiede la lista dei file al server "master" e ci metto lista file e anche md5_file e path di ogni file, dopo di che, lo confronto con quello che ho nel mio server dove lancio lo script
li confronto
e se trovo modifiche chiedo al server master di fare un print di quel file e con file_get_contents lo acchiappo e lo ributto al posto giusto...

Tutto funziona, i server si sincronizzano al server con il master
l'unica cosa e' il fatto sicurezza che volevo blindare grazie a $_SERVER, in pratica abilitavo la risposta solo a determinati ip..
ma il capo me l'ha fatto rifare in bash, ed oggi ho scritto questo:
SCRIPT RILEVA MODIFICHE

Codice: Seleziona tutto

#!/bin/bash

if [ ${#1} == 0 ]
then
    echo -e "\nUsage bash script_modificati.sh \$dir1 \$dir2";
    exit 1;
else
    dir1=$1
    dir2=$2
fi

#dir1=/tmp/temp1/app_test_2/
#dir2=/tmp/temp2/app_test_2/

clear
file_da_non_verificare="config\/myconfig.php config\/config.php config\/database.php"


#Creo file con md5 e nome file
find $dir1 -type f -exec md5sum {} \; > dir1.txt

find $dir2 -type f -exec md5sum {} \; > dir2.txt

#elimino dal file il nome directory dal path
sed -i 's|'$dir1'||g' dir1.txt 

sed -i 's|'$dir2'||g' dir2.txt

#elimino dalla lista i file esclusi dal confronto
for i in $file_da_non_verificare;
    do        
        awk "!/$i/" dir1.txt > tmp.txt
        mv tmp.txt dir1.txt
        

        awk "!/$i/" dir2.txt > tmp.txt
        mv tmp.txt dir2.txt
    done 


diff dir1.txt dir2.txt | awk '{print $3}' | sort | uniq

rm dir1.txt dir2.txt
SCRIPT AGGIORNAMENTO

Codice: Seleziona tutto

#!/bin/bash

if [ ${#1} == 0 ]
then
    echo -e "\nUsage bash UPDATER.sh NomeArchivio.tar.gz DirectoryDaAggiornare";
    exit 1;
else
    NomeArchivio=$1
    DirectoryDaAggiornare=$2
fi
clear;
DEST_PATH=temp
VETT_ESCLUSI=(/application/config/amazon_ses.php /application/config/config.php /application/config/database.php /application/helpers/pdf_helper.php /application/helpers/tcpdf/config/tcpdf_config.php /application/config/myconfig.php);
DATA_ODIERNA=$(date +%d-%m-%Y);

DIR_BKP="BACKUP_${DATA_ODIERNA}"

echo "Creo backup vecchi files"
sleep 2
cp -Rfv ${DirectoryDaAggiornare} ${DIR_BKP} > /dev/null
mkdir ${DEST_PATH};
echo
echo "estraggo i files dall'archivio"
sleep 2;
tar xvfz ${NomeArchivio} -C  ${DEST_PATH}  > /dev/null
echo 
echo "Elimino i files dalla directory dove ho estratto"
sleep 2
for i in ${VETT_ESCLUSI[*]}
{
    echo "Elimino $i dal nuovo archivio";
    rm -rfv "${DEST_PATH}/${i}"  > /dev/null;
}
echo
echo "Sovrascrivo i files"
sleep 2
cp -Rfv ${DEST_PATH} ${DirectoryDaAggiornare}  > /dev/null



echo
echo "Rimuovo i files temporanei"
sleep 2
rm -rfv ${DEST_PATH} > /dev/null
Tanto tempo sprecato.. ma non e' stato lavoro perso....

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: differenze tra array con subarray

Messaggio da targzeta »

Mi sembra un lavoro per rsync o addirittura git/svn, no?

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
darkstaring
Linux 3.x
Linux 3.x
Messaggi: 657
Iscritto il: mer 13 ott 2010, 13:55
Nome Cognome: Francesco Achenza
Desktop: KDE
Distribuzione: Arch Linux
Contatta:

Re: differenze tra array con subarray

Messaggio da darkstaring »

Usiamo svn.. ma non tutti i files sono da modificare, sarebbe meglio git per questo .... infatti dovremo migrare

Rispondi