2017-06-29 84 views
1

我基于导入的.csv文件创建表。只显示多个数据一次

这工作正常,但我想吐出一次公司名称。

所以这是CSV

company,value 
company1, 231 
company1, 432 
company1, 876 

如果我foreach的数据插入到表我想显示companyname一次。

echo'<table><tr><td>Companyname</td><td>Value</td>'; 
foreach ($data as $gegevens){ 
    $companyname = $gegevens['Companyname']; 
    $value = $gegevens['Value']; 
    echo '<tr><td>'.$companyname.'</td><td>'.$value.'</td></tr> '; 

} 
echo'</table>'; 

这是我想有作为输出什么:
[公司名称] [超值]
[公司1]             [231]
[                                   ]             [432]
[                                     ]             [876]

有关如何完成此操作的任何想法?

+0

你能不能告诉我们所期望的输出是什么应该看起来像? – domsson

+0

@domdom请参阅我的更新 – Interactive

+0

然后使用您在第一个循环后触发的布尔标志。参见[Bibhudatta的回答](https://stackoverflow.com/a/44823171/3316645)。虽然我会建议命名它比'$ flag'更有意义。此外,你最想检查['rowspan'](https://stackoverflow.com/questions/8706468/how-to-make-a-td-on-more-than-one-row)。 – domsson

回答

2

见OP对another answer评论:

哈哈.....差不多这一定是我不解释正确的故障。有(当然)多家公司。那么创建一个if语句或其他东西?

因此,我建议是这样的:

$data = array(
    array('Companyname' => 'FBI', 'Value' => '1'), 
    array('Companyname' => 'CIA', 'Value' => '2'), 
    array('Companyname' => 'CIA', 'Value' => '3'), 
    array('Companyname' => 'CIA', 'Value' => '4'), 
    array('Companyname' => 'NSA', 'Value' => '5'), 
    array('Companyname' => 'NSA', 'Value' => '6'), 
); 

$last_company = ""; // What was the last company we printed? 

echo'<table><tr><td>Companyname</td><td>Value</td>'; 
foreach ($data as $gegevens){ 
    $companyname = $gegevens['Companyname']; 
    $value = $gegevens['Value']; 
    if ($companyname == $last_company) { 
     echo '<tr><td></td><td>'.$value.'</td></tr>'; 
    } else { 
     echo '<tr><td>'.$companyname.'</td><td>'.$value.'</td></tr>'; 
     $last_company = $companyname; 
    } 
} 
echo'</table>'; 

这会产生以下结果(用浏览器查看时):

Companyname Value 
FBI   1 
CIA   2 
      3 
      4 
NSA   5 
      6 
+0

假设名称的顺序将改变,那么它将再次打印它... – pAsh

+0

@pAsh绝对正确。但是,如果看到这是表格数据,我会认为它是排序的或再次打印公司名称甚至会被期望(否则,你怎么能告诉哪个公司的价值属于?你会认为它属于你最后一个打印)。最糟糕的情况是,我们总是可以先排序数组。 *换句话说*:你描述的是一个功能,而不是一个错误。 – domsson

1

你可以使用标志变量来这样做。

$flag=True; 
    echo'<table><tr><td>Companyname</td><td>Value</td>'; 
    foreach ($data as $gegevens){ 
     $companyname = $gegevens['Companyname']; 
     $value = $gegevens['Value']; 
    if($flag){ 
    $flag=false; 
     echo '<tr><td>'.$companyname.'</td><td>'.$value.'</td></tr> '; 
    }else{ 
     echo '<tr><td> </td><td>'.$value.'</td></tr> '; 
    } 
    } 
    echo'</table>'; 

我会解决你的问题。

+0

我会用三元组来减少冗长,但这是一个风格问题。但是,以最佳实践的名义,我会建议将这个标志命名为比“flag”更有意义的东西。 PS:s/thing/think – domsson

+0

我看到了你要去的地方,但它不起作用。我只显示其他值。所以就像第一个循环被忽略了!设置第一个'$ flag'为真 – Interactive

+0

请再次检查一次,我修改它。 –

1
<?php 
$data = array(

    array('Companyname' => 'Company', 'Value' => '10'), 
    array('Companyname' => 'Company1', 'Value' => '10'), 
    array('Companyname' => 'Company1', 'Value' => '10'), 
    array('Companyname' => 'Company2', 'Value' => '10'), 
); 

$newdata = array(); 

foreach ($data as $gegevens){ 
    $newdata[$gegevens['Companyname']][] = $gegevens['Value']; 
} 

echo'<table><tr><td>Companyname</td><td>Value</td>'; 
foreach($newdata as $company => $values) { 
    echo '<tr><td>'.$companyname.'</td><td>'.implode('<br>' ,$values).'</td></tr> '; 
} 
echo'</table>'; 
?> 
0
$rows = array(); 
foreach($data as $gegevens) { 
    $companyname = $gegevens['Companyname']; 
    $value = $gegevens['Value']; 
    echo '<tr><td>'.$companyname.'</td><td>'.$value.'</td></tr> '; 
    if(isset($rows[$companyname])) { 
     $rows[$companyname] .= '<tr><td>&nbsp;</td><td>'.$value.'</td></tr> '; 
    } else { 
     $rows[$companyname] = '<tr><td>'.$companyname.'</td><td>'.$value.'</td></tr> '; 
    } 
} 
echo'<table><tr><td>Companyname</td><td>Value</td>'; 
echo implode("",$rows);