8768 sujets

Développement web côté serveur, CMS

Bonjour,

Actuellement en cours de réalisation d'un projet de comparaison de données, je rencontre actuellement un problème lors de la création d'un tableau.

J'arrive à stocker les différences et les égalités dans des variables puis à les insérer dans un nouveau tableau qui sera envoyé dans un fichier csv. Le soucis c'est que j'ai mes lignes où il n'y a que des égalités puis le problème c'est que si dans une ligne il y a une différence toutes les autres données disparaissent.

J'aimerai pouvoir faire en sorte que les différences viennent écraser les anciennes données plus valables.

Admettons, j'ai un tableau où en 1ere ligne j'ai : ("Raymond", "Pierre", "2nde7") et un autre tableau : ("Raymond", "Pierre", "1ere3"), j'aimerai que 1ere3 viennent écraser la donnée 2nde7.

Je vous montre le code ci-dessous

Merci d'avance

<?php
		if(isset($_POST['envoyer'])){
			if (is_uploaded_file($_FILES['avatar']['tmp_name'])) 
			{   
				$filename = $_FILES['avatar']['tmp_name'] . "'.";
			} 
			else {
				echo "Nom du fichier : '". $_FILES['avatar']['tmp_name'] . "'.";
			}
			
			$a1=Array();
			$row = 1;
			if (($handle = fopen($_FILES['avatar']['tmp_name'], "r")) !== FALSE) {
				$key = 0;    // Set the array key.
				while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
					$count = count($data);  //get the total keys in row
					$row++;
					//insert data to our array
					for ($i=0; $i < $count; $i++) {
						$a1[$key][$i] = $data[$i];
						echo $a1[$key][$i] . "<br />\n";
					}
					$key++;
				}
				fclose($handle);    //close file handle
			}


			$a2=Array();
			$row = 1;
			if (($handle1 = fopen($_FILES['avatar2']['tmp_name'], "r")) !== FALSE) {
				$key1 = 0;    // Set the array key.
				while (($data1 = fgetcsv($handle1, 1000, ",")) !== FALSE) {
					$count1 = count($data1);  //get the total keys in row
					$row++;
					//insert data to our array
					for ($i1=0; $i1 < $count1; $i1++) {
						$a2[$key1][$i1] = $data1[$i1];
						echo $a2[$key1][$i1] . "<br />\n";
					}
					$key1++;
				}
				fclose($handle1);    //close file handle
			}
			
			foreach ($a1 as $k1 => $v1) {
				if ($u = array_diff($a2[$k1], $a1[$k1]))
				{
				if($a2[$k1] !== $u){
					$update_items[$k1] = $u;
					}
				}
				elseif ($p = array_intersect($a2[$k1], $a1[$k1])){
				if($a2[$k1] === $p){
					$update_items[$k1] = $p;
					}
				}
			}
			print_r($update_items);
				
				// Paramétrage de l'écriture du futur fichier CSV
			$chemin = 'fichier.csv';
			$delimiteur = ','; // Pour une tabulation, utiliser $delimiteur = "t";

			// Création du fichier csv (le fichier est vide pour le moment)
			// w+ : consulter  http://php.net/manual/fr/function.fopen.php
 
			$fichier_csv = fopen($chemin, 'w+');

			// Si votre fichier a vocation a être importé dans Excel,
			// vous devez impérativement utiliser la ligne ci-dessous pour corriger
			// les problèmes d'affichage des caractères internationaux (les accents par exemple)
			fprintf($fichier_csv, chr(0xEF).chr(0xBB).chr(0xBF));

			// Boucle foreach sur chaque ligne du tableau
				foreach($update_items as $ligne){
				// chaque ligne en cours de lecture est insérée dans le fichier
				// les valeurs présentes dans chaque ligne seront séparées par $delimiteur
				fputcsv($fichier_csv, $ligne, $delimiteur);
				}
			

			// fermeture du fichier csv
			fclose($fichier_csv);
		}       
		?>
Pour vous donnez une idée du rendu voilà ce qui se produit : upload/60453-imagexe.PNG
Le soucis c'est que les différences écrasent les lignes où elles se produisent hors j'aimerai que cela écrase les anciennes données et que ça ressemble à la ligne 3 par exemple.

Merci pour votre aide.
Bonjour,
pour comparer 2 tableaux et remplacer les valeurs du premier par celles du second si nécessaire, tu peux faire de cette façon:

$array1 = array('1','2','3','4','5','6');
$array2 = array('1','2','8','15','5','6');

function test_it(&$item1, $key, $compare)
{
    if( $item1 !== $compare[$key] ){
        $item1[$key] = $compare[$key];
    }
}

array_walk($array1, 'test_it', $array2);

var_dump($array1);

Modifié par loicbcn (15 Dec 2015 - 09:02)