在php中导入时从csv中删除重复记录

在php中导入时从csv中删除重复记录,php,csv,datatable,Php,Csv,Datatable,我想从html表单导入一个csv文件,并用php处理它。 动态创建一个表并将其附加到我的div中以供预览 我只想要表中唯一记录的数组 我有以下php代码: $tmpName = $_FILES['blk_csv']['tmp_name']; $csvAsArray = array_unique((array_map('str_getcsv', file($tmpName))),SORT_REGULAR); $table_data = '<table id="template_

我想从html表单导入一个csv文件,并用php处理它。 动态创建一个表并将其附加到我的div中以供预览

我只想要表中唯一记录的数组

我有以下php代码:

$tmpName = $_FILES['blk_csv']['tmp_name'];

$csvAsArray = array_unique((array_map('str_getcsv', file($tmpName))),SORT_REGULAR);

$table_data = '<table id="template_table" name="template_table" class="table">';
$csvAsArrayU = $csvAsArray;

for ($i = 0; $i < count($csvAsArrayU); $i++) {
     
     if($i == 0){
        
         $table_data .= '<thead><tr>';
        
         for($h = 0 ; $h < count($csvAsArrayU[$i]); $h++){
            
            
             $table_data .= '<th class="text-center">'.$csvAsArrayU[$i][$h].'</th>';

         }
        
         $table_data .= '</tr></thead><tbody>';

     }
      else{
         $table_data .= '<tr id="row-'.$i.'">';
            
         for($r = 0 ; $r < count($csvAsArrayU[$i]); $r++){
                
            $table_data .= '<td  class="text-center">'.$csvAsArrayU[$i][$r].'</td>';

         }
         $table_data .= '</tr>';
        
      }
    
}
$table_data .= ' </tbody></table>'; 
如果您
print\r($csvAsArray)
它将提供以下输出:

Array ( [0] => Array ( [0] => NAME [1] => EMAIL ) [1] => Array ( [0] => Morris [1] => Morris@somerandomemail.com ) [8] => Array ( [0] => Jacob [1] => Jacob@somerandomemail.com ) ) 
如果您注意到第三个元素的索引是8而不是2。因此,DataTable库无法加载数据,并显示如下内容:

有谁能指导我如何解决这个问题吗?或者可能是另一种只加载数组中唯一行的方法

$csvAsArray = array_values($csvAsArray)
这将重置数组的键,使第三个元素的索引为2

:)

这将重置数组的键,使第三个元素的索引为2


:)

OP在评论中要求采用不同的方法。下面是实现我的建议的重写。我已经将函数级联转换成每行一个函数,以使其更具教育性。请阅读注释,理解所使用的函数,并记住:。现在,代码:

$tmpName = 'tmp/file.csv';

// Read lines; Filter for unique lines; Map array as CSV:
$rawLines = file($tmpName, FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
$uniqLines = array_unique($rawLines);
$csvAsArray = array_map('str_getcsv', $uniqLines);

// Get the header row:
$csvHeaderRow = array_shift($csvAsArray);

// Build table header:
$table_data = '<table id="template_table" name="template_table" class="table">';
$table_data .= '<thead><tr>';

// Iterate each header field:
foreach($csvHeaderRow as $field){
    $table_data .= '<th class="text-center">'.$field.'</th>';
}

$table_data .= '</tr></thead><tbody>';

// Build table body, iterate lines/rows:
foreach($csvAsArray as $i => $row){
    $table_data .= '<tr id="row-'.$i.'">';

    // Iterate each field in the row:
    foreach($row as $field) {
        $table_data .= '<td  class="text-center">'.$field.'</td>';
    }

    $table_data .= '</tr>';
}

// Wrap up table
$table_data .= ' </tbody></table>'; 

如果您想要一种简单的方法来添加换行符并使HTML输出更具可读性。并且不希望在每行末尾都钉上一个“\n”(丑陋!)。然后,您可以附加到数组(
$table\u data[]=
),而不是字符串串联(
$table\u data.=
),最后
内爆(“\n”,$table\u data)
,您的HTML输出将更具可读性。

OP在注释中要求使用不同的方法。下面是实现我的建议的重写。我已经将函数级联转换成每行一个函数,以使其更具教育性。请阅读注释,理解所使用的函数,并记住:。现在,代码:

$tmpName = 'tmp/file.csv';

// Read lines; Filter for unique lines; Map array as CSV:
$rawLines = file($tmpName, FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
$uniqLines = array_unique($rawLines);
$csvAsArray = array_map('str_getcsv', $uniqLines);

// Get the header row:
$csvHeaderRow = array_shift($csvAsArray);

// Build table header:
$table_data = '<table id="template_table" name="template_table" class="table">';
$table_data .= '<thead><tr>';

// Iterate each header field:
foreach($csvHeaderRow as $field){
    $table_data .= '<th class="text-center">'.$field.'</th>';
}

$table_data .= '</tr></thead><tbody>';

// Build table body, iterate lines/rows:
foreach($csvAsArray as $i => $row){
    $table_data .= '<tr id="row-'.$i.'">';

    // Iterate each field in the row:
    foreach($row as $field) {
        $table_data .= '<td  class="text-center">'.$field.'</td>';
    }

    $table_data .= '</tr>';
}

// Wrap up table
$table_data .= ' </tbody></table>'; 

如果您想要一种简单的方法来添加换行符并使HTML输出更具可读性。并且不希望在每行末尾都钉上一个“\n”(丑陋!)。然后,您可以附加到一个数组(
$table\u data[]=
),而不是字符串串联(
$table\u data.=
),最后
内爆(“\n”,$table\u data)
,您的HTML输出将更具可读性。

好吧,这一小行代码已经发挥了神奇的作用。证明我的研究很差。谢谢你帮助我!好吧,那一小行代码已经发挥了神奇的作用。证明我的研究很差。谢谢你帮助我!你的方法很好。请注意,这将保留关键点。所讨论的条目可能位于源CSV中的该位置,就这么简单。您还可以在
文件
上运行
array\u unique
,只映射CSV的其余行。目前,您正在迭代大量重复项,这些重复项将被丢弃。这还将为您提供连续索引,而无需运行
array\u values
。您还可以使用
foreach
循环,而不是使用基于计数的
for
循环访问数组。这就是他们的目的。你能举个例子吗?如果我能完全理解另一种方法,我会非常高兴。我已经重写了相关部分,并将其作为答案发布。你的方法很好。请注意,这将保留关键点。所讨论的条目可能位于源CSV中的该位置,就这么简单。您还可以在
文件
上运行
array\u unique
,只映射CSV的其余行。目前,您正在迭代大量重复项,这些重复项将被丢弃。这还将为您提供连续索引,而无需运行
array\u values
。您还可以使用
foreach
循环,而不是使用基于计数的
for
循环访问数组。这就是他们的目的。你能举个例子吗?如果我能完全理解另一种方法,我会非常高兴。我已经重写了相关部分,并将其作为答案发布。
<table id="template_table" name="template_table" class="table"><thead><tr><th class="text-center">NAME</th><th class="text-center">EMAIL</th></tr></thead><tbody><tr id="row-0"><td  class="text-center">Morris</td><td  class="text-center">Morris@somerandomemail.com</td></tr><tr id="row-1"><td  class="text-center">Jacob</td><td  class="text-center">Jacob@somerandomemail.com</td></tr> </tbody></table>