首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在循环中打印逗号分隔的数据时,如何防止尾随逗号?

在循环中打印逗号分隔的数据时,如何防止尾随逗号?
EN

Stack Overflow用户
提问于 2020-07-07 20:22:49
回答 2查看 124关注 0票数 0

我正在编写一段php代码,该代码将一些DB数据作为一组逗号分隔的数组进行回显。

代码如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
include('inc_db.php');  
$query = "SELECT * FROM product WHERE p_shop_id=1";
$result = $conn->query($query);
if ($result->num_rows > 0) {
    while($row = $result->fetch_array()) {
        if($result->num_rows == 1)
            echo "[" .$row['p_description'] ."," .$row['p_category'] ."," .$row['p_cost'] ."," .$row['p_stock'] ."]";
        else
            echo "[" .$row['p_description'] ."," .$row['p_category'] ."," .$row['p_cost'] ."," .$row['p_stock'] ."], ";
    }
}
$conn->close();

* include行是到数据库的连接。

在这一行上:

代码语言:javascript
代码运行次数:0
运行
复制
if($result->num_rows == 1)

我正在尝试检测循环是否到达了结果的最后一行,这样回声行就会在没有逗号的情况下结束(就像'else‘短语中发生的那样)。

我猜我做错了'if‘语句,因为当我运行程序时,我得到的数组在每一行的末尾都有一个逗号,包括最后一行。

结果是:

代码语言:javascript
代码运行次数:0
运行
复制
[Eggs, Food, 20, 20], [Coca Cola, Drinks, 5, 30],

预期的结果是:

代码语言:javascript
代码运行次数:0
运行
复制
 [Eggs, Food, 20, 20], [Coca Cola, Drinks, 5, 30]

(末尾不带逗号)

那么,检测while循环到达最后一行的正确方法是什么呢?

EN

回答 2

Stack Overflow用户

发布于 2020-07-07 20:41:09

你不需要计算行数。您也不需要知道是否正在处理最后一行。

我真的不明白为什么需要这种格式,但是您可以使用implode()并用方括号括起来,以简洁地存储行数据。然后,当循环结束时,您可以使用逗号再次内爆--这确保了不会有混乱的东西需要清理。

此代码段将数组数组转换为大括号包装的逗号分隔字符串数组,然后在循环后将该数组转换为逗号分隔字符串。(Demo)

代码语言:javascript
代码运行次数:0
运行
复制
$result = $conn->query("SELECT p_description, p_category, p_cost, p_stock FROM product WHERE p_shop_id = 1");
$rows = [];
foreach ($result as $row) {
    $rows[] = '[' . implode(', ', $row) . ']';
}
echo implode(', ', $rows);

或者可以在每个带括号的字符串前面加上0或1个逗号:(Conditional Demo) (Functional Demo)

代码语言:javascript
代码运行次数:0
运行
复制
foreach ($result as $i => $row) {
    echo ($i ? ', ' : '') . '[' . implode(', ', $row) . ']';
    //echo str_repeat(', ', (bool)$i) . '[' . implode(', ', $row) . ']';
}

或者,如果您更喜欢函数迭代器,可以省略临时变量$rows,只使用array_map():(Demo)

代码语言:javascript
代码运行次数:0
运行
复制
echo implode(', ', array_map(function($row) {
    return '[' . implode(', ', $row) . ']'; 
}, $result));

或者,您可以使用array_reduce(),并在迭代行时检查是否有任何数据写入$carry变量。这个概念是,如果您不是在处理第一次迭代,则只在前面加上逗号。(Demo)

代码语言:javascript
代码运行次数:0
运行
复制
echo array_reduce($result, function($carry, $row) {
    $carry .= (!$carry ? '' : ', ') . '[' . implode(', ', $row) . ']'; 
    return $carry;
});
票数 1
EN

Stack Overflow用户

发布于 2020-07-07 20:49:39

您可以声明一个将在循环中递增的变量,并使用它来检查$result->num_rows,以查看它是否是最后一个记录。

代码语言:javascript
代码运行次数:0
运行
复制
if ($result->num_rows > 0) {
    $index = 0;
    while($row = $result->fetch_array()) {
            if($result->num_rows == ($index+1)) //Check if it's the last record
                echo "[" .$row['p_description'] ."," .$row['p_category'] ."," .$row['p_cost'] ."," .$row['p_stock'] ."]";
            else
                echo "[" .$row['p_description'] ."," .$row['p_category'] ."," .$row['p_cost'] ."," .$row['p_stock'] ."], ";

          $index++;
            
        }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62775220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档