我有一张包含以下内容的表:
id,sender,recepients
1 1 2
2 1 2,3,4,5
在显示页面中,我必须将具有多于1个项目的接收者分别显示为具有独立行号的独立行。使用我的旧脚本,显示的显示是字段1,数字为1.字段2(多项)也以1开头。它应该继续字段1的数量。
当前显示:
no. id sender recepients
1. 1 1 2
1. 2 1 2 // the No. should be 2
2. 2 1 3
3. 2 1 4
4. 2 1 5
它的显示应该是:
no. id sender recepients
1. 1 1 2
2. 2 1 2
3. 2 1 3
4. 2 1 4
5. 2 1 5
当前代码:
$i=0;
while($r = mysql_fetch_array($a)) {
$i++;
$tuj = explode(",",$r['recepients']);
for ($c=$i; $c < count($tuj)+$i; $c++) {
//display data
}
问题:
我该怎么做才能确定线路数量?它是用SQL还是PHP完成的?
答案 0 :(得分:1)
在MySQL中,假设接收者的数量不是太长,您可以使用暴力:
select t.id, t.sender,
substring_index(substring_index(recipients, ',', n.n), ',', -1) as recipient
from table t cross join
(select 1 as n union all select 2 union all select 3 union all select 4 union all select 5
) n
where n.n <= (1 + length(recipients) - length(replace(recipients, ',', ''));
where
子句计算列表中的项目数。
答案 1 :(得分:0)
我认为以下是您想要做的事情 - 我用硬编码数组替换了数据库查找以进行测试,但您应该能够将foreach
替换为您的while
并且能够正常工作代码:
<?php
$lineCount=1;
echo "no. id sender recepients\n";
$a[0]=array('id'=>12, 'sender'=>123, 'recepients'=>"1");
$a[1]=array('id'=>13, 'sender'=>124, 'recepients'=>"1,2,3");
$a[2]=array('id'=>14, 'sender'=>125, 'recepients'=>"2,3,4,5,6");
foreach ($a as $r) {
//while($r = mysql_fetch_array($a)) {
$tuj = explode(",",$r['recepients']);
for ($c=0; $c < count($tuj); $c++) {
echo $lineCount++." ".$r['id']." ".$r['sender']." ".$tuj[$c]."\n";
}
}
?>
以上输出:
no. id sender recepients
1 12 123 1
2 13 124 1
3 13 124 2
4 13 124 3
5 14 125 2
6 14 125 3
7 14 125 4
8 14 125 5
9 14 125 6
注意:
我使用了一个名为lineCount
的变量来计算行数
我使用变量$c
来计算$tuj
数组中的元素。您将$c
偏移$i
,这在某种程度上混淆了使用$c
作为行计数器或索引计数器。
如果您想编写易于调试的代码,清楚地命名变量会有所帮助......