我有一张表:
client_id | name | bank_name
------------------------------------
1 | Steve | Bank 1
1 | Steve | Bank 1
1 | Steve | Bank 3
我想打印出如下声明:
Client: Steve
Current bank: Bank 1, Bank 3
这是我目前的代码。 (请记住我在模板pdf中打印它,所以忽略php和div标签,它们是正确的。):
<?php
$currentBank = '';
foreach($data as $bank){
$currentBank .= $bank->bank_name;
?>
<div>Current bank: {{ $currentBank }} </div>
<?php
}
?>
任何人都可以帮我实现想要的格式,忽略重复的项目并以格式打印出来:'Bank 1,Bank2'。
目前使用我的代码,我的输出是:
Current bank: Bank1
Current bank: Bank1Bank1
Current bank: Bank1Bank1Bank3
注意:我不能在我的sql查询中使用DISTINCT
,因为模板的另一部分要求我打印出包括重复项在内的所有内容
答案 0 :(得分:1)
SQL中问题的答案是:
select name, group_concat(distinct bank_name)
from t
group by name;
我不明白这是如何适合您的应用程序的其余部分。我可以说你应该在数据库中进行这种处理,而不是在应用程序端使用循环。
答案 1 :(得分:1)
您可以在SQL中执行此操作:
SELECT name, GROUP_CONCAT(DISTINCT bank_name) FROM table GROUP BY client_id;
答案 2 :(得分:1)
您需要花费整个for循环遍历所有可用数据。将名称收集到一个新数组中,因为这使我们可以通过array_unique轻松获得独特的数据。另一个选择是将bankNames存储为数组中的键 - 请参阅第二个示例
<?
$currentBank = '';
$bankNameList = [];
foreach($data as $bank):
$bankNameList[] = $bank->bank_name;
}
$bankNameList = array_unique($bankNameList);
$currentBank = implode(', ', $bankNameList);
?>
<div>Current bank: {{ $currentBank }} </div>
<? endfor; ?>
第二个例子没有array_unique()
<?
$currentBank = '';
$bankNameList = [];
foreach($data as $bank):
$bankNameList[$bank->bank_name]++;
}
$currentBank = implode(', ', array_keys($bankNameList));
?>
<div>Current bank: {{ $currentBank }} </div>
<? endfor; ?>
最简单的方法是使用命名的辅助函数在模板外部组织这些数据。这样,您的模板就不会增长到数千条未记录的行
<?
/**
* Return all $item->bank_names
* as comma delimited string
*/
public function concatAllBankNames($data) {
$bankNameList = [];
foreach($data as $bank):
$bankNameList[$bank->bank_name]++;
}
return implode(', ', array_keys($bankNameList));
}
//.. in some controller
foreach ($databasedata as $row) {
$row[ $row['username'] ]['bank_names_concat'] = $this->concatAllBankNames($row['data']);
}
//assign data to template system somehow
$template->rows = $rows;
//or
$template['rows'] = $rows;