Pagina 1 di 1

differenze tra array con subarray

Inviato: sab 3 mar 2018, 10:50
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...

Re: differenze tra array con subarray

Inviato: dom 4 mar 2018, 18:30
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

Re: differenze tra array con subarray

Inviato: lun 5 mar 2018, 22:39
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

Re: differenze tra array con subarray

Inviato: mar 6 mar 2018, 15:56
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;
    }

Re: differenze tra array con subarray

Inviato: gio 8 mar 2018, 20:51
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

Re: differenze tra array con subarray

Inviato: gio 8 mar 2018, 22:05
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....

Re: differenze tra array con subarray

Inviato: dom 11 mar 2018, 22:12
da targzeta
Mi sembra un lavoro per rsync o addirittura git/svn, no?

Emanuele

Re: differenze tra array con subarray

Inviato: dom 11 mar 2018, 22:13
da darkstaring
Usiamo svn.. ma non tutti i files sono da modificare, sarebbe meglio git per questo .... infatti dovremo migrare