抱歉,我不知道如何在标题中理解这一点。
基本上我有一个有两行的表。
现在我想在我的页面上显示引用,然后显示所有文档列。
但是你可以看到我对两行有相同的引用。如果用户使用相同的参考文件上传文档,我希望能够在参考文献下显示所有文档。
例如,我想在页面上看起来像这样:
11111111
word.jpg
a17.gif
Matthew Smart CV.docx
word.jpg
a17.png
Matthew Smart CV.docx
这是我到目前为止所做的并且卡住了
PHP / MYSQL:
<?php
$query = "SELECT * ";
$query .= "FROM customers ";
$query .= "WHERE reference = 11111111";
$results = mysqli_query($connection, $query);
$cnt = 0;
$customer_doc = array();
while($customer_details = mysqli_fetch_assoc($results)) {
$customer_ref = $customer_details["reference"];
$cnt ++;
$customer_doc[] = $customer_details['doc' . $cnt];
}
echo $customer_ref;
?>
<pre>
<?php
print_r($customer_doc);
?>
</pre>
我不知道该怎么做。
任何人都可以帮助我,以便我可以从中吸取教训吗?
答案 0 :(得分:2)
假设您最终会在结果集中查询多个reference
值,那么CBroe在主要注释线程中提到的技术涉及在每次迭代时存储reference
的最后一个值。 while
循环。如果值已从上一个值更改,则打印输出。如果它是相同的,则不需要在该循环中打印它,而只需打印其他列。
注意:我在这里使用非常原始的输出执行此操作,仅使用换行符echo
。
// Start with an empty value for the "last one"
$last = null;
while ($customer_details = mysqli_fetch_assoc($results)) {
// Check if the newly fetched row differs from the previous value
if ($customer_details['reference'] != $last) {
// It is different! Print it out
echo $customer_details['reference'] . "\n";
}
// Store this current one into the $last var for
// comparison on the next round
$last = $customer_details['reference'];
// Print the other columns...
echo $customer_details['doc1'] . "\n";
echo $customer_details['doc2'] . "\n";
echo $customer_details['doc3'] . "\n";
}
现在,假设您要将这些存储到数组中。这将非常方便,因为您可以使用reference
列建立索引,并为其他列创建子数组。这更容易,您无需检查值是否更改。您只需要在每个while
次迭代中附加一个子数组。
// Array to hold all results:
$all = array();
while ($customer_details = mysqli_fetch_assoc($results)) {
// Append a new sub-array of the 3 other cols to
// the main array's key by reference using the []
// array append syntax
$all[$customer_details['reference']][] = array(
'doc1' => $customer_details['doc1'],
'doc2' => $customer_details['doc2'],
'doc3' => $customer_details['doc3']
);
}
阵列现在看起来像
Array (
'1111111' => Array (
Array (
'doc1' => 'word.jpg'
'doc2' => 'a17.gif',
'doc3' => 'Matthew Smart CV.docx'
),
Array (
'doc1' => 'word.jpg'
'doc2' => 'a17.gif',
'doc3' => 'Matthew Smart CV.docx'
)
),
'222222' => Array (
Array (
'doc1' => 'xyz.jpg'
'doc2' => 'z17.gif',
'doc3' => 'Matthew Smart CV.pdf'
),
Array (
'doc1' => 'xyz.jpg'
'doc2' => 'z17.gif',
'doc3' => 'Matthew Smart CV.pdf'
),
)
所以你可以使用嵌套的foreach
循环它。外部获取reference
,内部获取其他值:
foreach ($all as $reference => $rows) {
// Write out the reference, which was the array key
echo $reference . "\n";
// Then in a loop, write out the others
foreach ($rows as $row) {
echo $row['doc1'] . "\n";
echo $row['doc2'] . "\n";
echo $row['doc3'] . "\n";
}
}
最后一个是您可以在查询中使用的GROUP BY
黑客。我不是完全推荐它,但想表明它是可能的。如果您将GROUP_CONCAT()
与普通CONCAT_WS()
一起使用,则可以在一行行中生成reference
,然后生成所有其他文档,例如{ {1}}。在PHP中,您只需要一个循环并在分隔符||
上explode()
。
||
这将生成字面结构如下的行:
$query = "SELECT reference, GROUP_CONCAT(CONCAT_WS('||', doc1, doc2, doc3) SEPARATOR '||') AS docs FROM customers GROUP BY reference";
即列中的1111111, word.jpg||a17.gif||Matthew Smart CV.docx||word.jpg||a17.gif||Matthew Smart CV.docx
,然后是reference
作为名为||
的列加入的所有其他字符串。
docs
同样,我不建议实际使用它,但可以这样做。
答案 1 :(得分:1)
您需要&#34;按参考分组&#34;在数组中:
$customer_docs = [];
while($customer_details = mysqli_fetch_assoc($results))
$customer_doc[$customer_details["reference"]][] = $customer_details;
foreach($customer_docs as $reference=>$docs){
echo $reference;
foreach($docs as $doc){
echo $doc['doc1'];
//...
}
// "breakline"
}
或&#34;经典方式&#34;:在while循环之前为当前引用添加临时变量,并且每次迭代都将先前的引用与当前引用进行比较。