如何轻松删除数组中的最后一个逗号?

6

假设我有以下代码:

$array = array("john" => "doe", "foe" => "bar", "oh" => "yeah");

foreach($array as $i=>$k)
{
echo $i.'-'.$k.',';
}

回声"john-doe,foe-bar,oh-yeah,"

如何去掉最后的逗号?

11个回答

20

你也可以使用rtrim函数来实现:

$result = '';
foreach($array as $i=>$k) {
    $result .= $i.'-'.$k.',';
}
$result = rtrim($result,',');
echo $result;

3
是的,忘记了修剪。+1 - Jim
@niki 我不会把取消设置任意偏移量称为数组操作。如果它是最后一个,那么可以;但根据最小惊讶原则,您不希望它支持取消设置最后一个元素而不是其他元素。 - NullUserException
@Daniel k:你会给它起什么名字呢?这是ArrayAccess接口定义的操作之一。在我看来,这些就是数组操作 ;) - NikiC
@NullUserException:是的,你说得对,底层实现是不同的。但我仍然期望所有数组操作也适用于字符串,因为字符串只是数组的一种特殊形式 ;) - NikiC
@NullUserException: “unless”并不少见;) 此外,根据实现方式,您不需要复制整个字符串。例如,您可以将字符串的长度属性减少,并从特定索引开始向下移动所有字符。这仍然比复制所有内容要快。 - NikiC
显示剩余6条评论

11

我不喜欢之前的所有食谱。

Php不是C语言,它有更高级的方法来处理这个特定的问题。

我将从你拥有这样一个数组的点开始:

$array = array('john-doe', 'foe-bar', 'oh-yeah');

你可以使用循环或者array_map()函数来从初始数组构建出这样的一个数组。请注意,我在使用单引号字符串。如果你没有需要替换的变量名,这是一种微小的优化。

现在你需要从这个数组生成一个CSV字符串,可以像这样完成:

echo implode(',', $array);

这种方法的好处是我们可以更轻松地更改分隔符。此外,您稍后可以将字符串拆分为类似于此的数组。不确定性能方面是否存在缺陷。 - thethanghn
我也更喜欢这个。如果不必要,就不要循环。 - Powertieke
显然你甚至没有阅读所有之前的配方,因为这已经被premiso建议过了。 - Mischa
这是我的建议,但我没有使用array_map函数,感谢captaintokyo。@Powertieke,它确实循环,因为array_map()必须在数据上进行循环。我认为OP发布的数组只是他从其他地方获取的数据的演示。 - Jim

7

一种方法是使用substr函数。

$array = array("john" => "doe", "foe" => "bar", "oh" => "yeah");

$output = "";
foreach($array as $i=>$k)
{
    $output .= $i.'-'.$k.',';
}

$output = substr($output, 0, -1);

echo $output;

另一种方法是使用 implode 函数。
$array = array("john" => "doe", "foe" => "bar", "oh" => "yeah");

$output = array();
foreach($array as $i=>$k)
{
    $output[] = $i.'-'.$k;
}

echo implode(',', $output);

3

我不喜欢使用 substr 的想法,因为这是不好的编程风格。这个想法是将所有元素连接起来,并用特殊的“分隔”短语分隔它们。调用子字符串的想法就像使用激光来射击鸟。

在我目前处理的项目中,我们试图摆脱编码中的坏习惯。而这个示例被认为是其中之一。我们强制程序员编写这样的代码:

$first = true;
$result = "";
foreach ($array as $i => $k) {
  if (!$first) $result .= ",";
  $first = false;
  $result .= $i.'-'.$k;
}
echo $result;

这段代码的目的比使用substr函数更清晰。或者你可以简单地使用implode函数(我们的项目是用Java编写的,所以我们不得不设计自己的函数来连接字符串)。只有在真正需要时才应该使用substr函数。在这里,应该避免使用它,因为这是一种糟糕的编程风格的标志。

这是编程风格不好的标志吗?您能为我们所有人详细解释一下吗?就我所见,它并不妨碍性能。我可以理解清晰度方面的要求,但同时去查找substr函数的作用也并不难。谢谢! - Jim
在我看来,每个工具都应该在程序中得到适当的使用,而 substr 的目的不是为了在字符串拼接时服务,它被设计用于处理其他的问题。此外,只有在代码中出现一次时,substr 才显得清晰易懂。如果存在多个这样的片段,代码就会变得难以阅读。因此,在我们的项目中,我们改用普通的字符串拼接,并且为此编写了一个特殊的函数。现在,与字符串相关的部分代码更加易读。 - SPIRiT_1984
非常感谢您提供这个出色而专业的解决方案。(y) - Faisal Ramzan

1
我总是使用这种方法:
$result = '';
foreach($array as $i=>$k) {
    if(strlen($result) > 0) {
        $result .= ","
    }
    $result .= $i.'-'.$k;
}
echo $result;

使用strlen不是一个好主意。请参考Joel Spolsky的“回到基础”文章,了解原因。只需使用布尔标志来执行此类检查,因为在最坏情况下(数组有N个元素 - 单个字符),您会得到O(N ^ 2)复杂度。 - SPIRiT_1984
一般情况下,不要使用字符串函数来达到一些可以通过简单编程技巧轻松实现的效果(如果想要摆脱最后一个逗号,最好根本就不生成最后一个逗号)。 - SPIRiT_1984

1

假设该数组是一个索引,在我这里可以运行。我循环 $i 并将其与 $key 进行比较。当键结束时,逗号不会打印出来。注意 IF 有两个值,以确保第一个值在开头没有逗号。

foreach($array as $key => $value)
{
    $w = $key;
    //echo "<br>w: ".$w."<br>";// test text
    //echo "x: ".$x."<br>";// test text
    if($w == $x && $w != 0 )
    {
    echo ", ";
    }
    echo $value;
    $x++;
}

1
尝试在foreach条件之后使用此代码,然后输出$result1。
$result1=substr($i, 0, -1);

0

看这个例子,你就能轻松理解了

$name = ["sumon","karim","akash"];
foreach($name as $key =>$value){
 echo $value;
 if($key<count($name){
     echo ",";
 }
}

应该是 $key + 1 或 count($name) - 1。 - Kari Kääriäinen

0
$foods = [
    'vegetables' => 'brinjal',
    'fruits' => 'orange',
    'drinks' => 'water'
];

$separateKeys = array_keys($foods);
$countedKeys = count($separateKeys);

for ($i = 0; $i < $countedKeys; $i++) {
    if ($i == $countedKeys - 1) {
        echo $foods[$separateKeys[$i]] . "";
    } else {
        echo $foods[$separateKeys[$i]] . ", \n";
    }
}

这里$foods是我的示例关联数组。
我分离了数组的键来计算键的数量。
然后通过for循环,如果不是最后一个元素,则打印逗号,并通过$countedKeys-1删除逗号。


0

我通过使用数组的最后一个键从最后一个值中删除了逗号。希望这能给你一些想法。

   $last_key =  end(array_keys($myArray));
                           foreach ($myArray as $key => $value ) {
                              $product_cateogry_details="SELECT * FROM `product_cateogry` WHERE `admin_id`='$admin_id' AND `id` = '$value'";
                                  $product_cateogry_details_query=mysqli_query($con,$product_cateogry_details);
                                  $detail=mysqli_fetch_array($product_cateogry_details_query);

                                  if ($last_key == $key) {
                                    echo $detail['product_cateogry'];
                                  }else{
                                    echo $detail['product_cateogry']." , ";
                                  }

                          }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接