2016-01-06 1 views
0

Je reçois un champ spécifique de 4 tables différentes.Supprimer les doublons de tableau PHP (array_unique)

<?php 

//I connect to the database and the 4 tables 

// Location of CSV 
$location = 'path.csv'; 

// List creation that will be updated with the fields and be put into my CSV file 
$list = array(); 

// Read csv file to avoid adding duplicates 
$file = fopen($location, 'r'); 
$data = array(); 

while($row = fgetcsv($file)) 
{ 
    $data[] = $row; 
} 

// Query 1 
$sql = ('select distinct(field) as field from '.$table1.''); 

// Run the query 
$query = $Db->query($sql); 

// Check for SQL errors 
if ($Db->error) 
{ 
    return ($Db->error); 
} 

// Put data in the list 
while ($row = $query->fetch_assoc()) 
{ 
    array_push($list,array($row['field'], '')); 
} 

// Query 2 
$sql = ('select distinct(field) as field from '.$table2.''); 

// Run the query 
$query = $Db->query($sql); 

// Check for SQL errors 
if ($Db->error) 
{ 
    return ($Db->error); 
} 

// Put data in the list 
while ($row = $query->fetch_assoc()) 
{ 
    array_push($list,array($row['field'], '')); 
} 

// Query 3 
$sql = ('select distinct(field) as field from '.$table3.''); 

// Run the query 
$query = $Db->query($sql); 

// Check for SQL errors 
if ($Db->error) 
{ 
    return ($Db->error); 
} 

// Put data in the list 
while ($row = $query->fetch_assoc()) 
{ 
    array_push($list,array($row['field'], '')); 
} 

// Query 4 
$sql = ('select distinct(field) as field from '.$table4.''); 

// Run the query 
$query = $Db->query($sql); 

// Check for SQL errors 
if ($Db->error) 
{ 
    return ($Db->error); 
} 

// Put data in the list 
while ($row = $query->fetch_assoc()) 
{ 
    array_push($list,array($row['field'], '')); 
} 


// Save list in the csv file without overwriting 
$fp = fopen($location, 'a'); 

foreach (array_unique($list) as $fields) 
{ 
    if (in_array($fields, $data)) 
    { 
     echo "Duplicate found"; 
    } 
    else 
    { 
     echo "Save to file"; 
     fputcsv($fp, $fields); 
    }   
} 

fclose($fp);  

?> 

À la fin je vérifie si les champs sont déjà dans le fichier. Le seul problème est que j'ai encore des doublons car certaines tables peuvent avoir exactement le même champ. Donc, je veux supprimer les doublons de la "liste" du tableau PHP.

J'utilise:

$cleanlist = array_unique($list); 

mais je reçois une erreur:

PHP Notice: Array to string conversion

Plus précisément le changement dans mon code est:

$cleanlist = array_unique($list); 

// Save list in the csv file without overwriting 
$fp = fopen($location, 'a'); 

foreach ($cleanlist as $fields) 
{ 
    if (in_array($fields, $data)) 
    { 
     echo "Duplicate found"; 
    } 
    else 
    { 
     echo "Save to file"; 
     fputcsv($fp, $fields); 
    }   
} 

Répondre

1

Vous pouvez réduire la quantité de code en utilisant UNION dans l'instruction SELECT.

SELECT field FROM table1 
UNION 
SELECT field FROM table2 
UNION 
SELECT field FROM table3 
UNION 
SELECT field FROM table4 

UNION renvoie des résultats distincts par défaut.

+0

Excellente solution. Cela économise beaucoup de lignes! J'ai posté une réponse aussi mais c'est mieux. Le mien est juste un moyen d'utiliser array_unique pour une table n-dimension. –

2

qu'expliquer en the docs, array_unique compare les éléments en tant que chaînes par défaut. Vous obtenez cette erreur parce que PHP essaye de convertir un tableau en chaîne. Vous avez un tableau 2D, un tableau de tableau. Vous pouvez utiliser l'indicateur SORT_REGULAR pour comparer les éléments tels qu'ils sont. Mais attention, seules les paires clé/valeur sont considérées comme identiques.

0

Cela a fonctionné:

$list = array_map("unserialize", array_unique(array_map("serialize", $list))); 

Le $list est un tableau 2d.