2016-01-06 3 views
0

Я получаю определенное поле из 4 разных таблиц.Удалить дубликаты из массива 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);  

?> 

В конце я проверяю, находятся ли уже поля в файле. Единственная проблема заключается в том, что у меня все еще есть дубликаты, потому что некоторые таблицы могут иметь точно такое же поле. Итак, я хочу удалить дубликаты из массива «список» PHP.

Я использую:

$cleanlist = array_unique($list); 

, но я получаю сообщение об ошибке:

PHP Notice: Array to string conversion

Более конкретно изменение моего кода:

$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); 
    }   
} 

ответ

1

Вы можете уменьшить количество кода, используя UNION в инструкции SELECT.

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

UNION возвращает отличные результаты по умолчанию.

+0

Отличное решение. Это экономит массу линий! Я тоже написал ответ, но лучше. Mine - это просто способ использования array_unique для n-мерной таблицы. –

2

Как объяснить в the docs, array_unique сравнивает элементы как строки по умолчанию. Вы получаете эту ошибку, потому что PHP пытается преобразовать массив в строку. У вас есть 2D-массив, массив массива.

Вы можете использовать флаг SORT_REGULAR, чтобы сравнить элементы так, как они есть. Но будьте осторожны, только те же пары ключ/значение считаются идентичными.

0

Это сработало:

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

The $list является 2d массив.

Смежные вопросы