用 & 符号替换最后一个逗号

5

我已经到处搜索,但是找不到适合我的解决方案。

我有以下内容:

$bedroom_array = array($studio, $one_bed, $two_bed, $three_bed, $four_bed);

这个例子中,假设:

$studio = '1';
$one_bed = '3';
$two_bed = '3';

我使用implode函数将所有值之间用逗号隔开:
$bedroom_list = implode(", ", array_filter($bedroom_array));
echo $bedroom_list;

然后输出:

1, 2, 3

我想做的是找到字符串中最后一个逗号并用&替换它,所以它将变成:

1, 2 & 3

该字符串的长度可能不总是这么长,它可以更短或更长,例如1,2,3,4等。 我已经尝试使用substr函数,但不确定它是否适用于我的需求?


我在这里回答了同样的问题:如何编辑implode,使其使用两个字符串连接值? - GolezTrol
可能是以下问题的重复:将数组用“,”分隔并在最后一个项目之前添加“和” - Angry Dan
8个回答

31

弹出最后一个元素,将其余元素合并,然后再把最后一个元素放回去。

$bedroom_array = array('studio', 'one_bed', 'two_bed', 'three_bed', 'four_bed');
$last = array_pop($bedroom_array);
$string = count($bedroom_array) ? implode(", ", $bedroom_array) . " & " . $last : $last;

如果必要的话,将&转换为实体&


2
我会将$string = implode(", ", $bedroom_array) . " & " . $last;更改为$string = count($bedroom_array) ? implode(", ", $bedroom_array) . " & " . $last : $last;以覆盖在弹出之前数组中只有一个元素的情况。此外,如果这只是直接传递到浏览器,请使用'&'而不是'&' - daiscog
1
这是一个带有一些错误检查的函数版本:http://www.ideone.com/SQZfi - Brad Christie
谢谢你的帮助!我尝试使用Michael的方法,但是由于数组中的变量并不总是设置的,因此出了一些问题-因此需要使用array_filter。我弄懂了&符号的工作原理,但它仍然会显示最后一个数组,所以我会得到1,2&2而不是1&2。最终,我使用了Brad的代码,它像梦想一样运行!不过我仍然对其他解决方法感兴趣! - iain

6

如果您有用逗号分隔的单词列表,您可以使用以下代码:

$keyword = "hello, sadasd, sdfgdsfg,sadfsdafsfd, ssdf, sdgdfg";
$keyword = preg_replace('/,([^,]*)$/', ' & \1', $keyword);
echo $keyword;

这将输出: hello, sadasd, sdfgdsfg,sadfsdafsfd, ssdf & sdgdfg


2
一个适用于任何大小数组($b = $bedroom_array)的一行代码替代方案:
echo count($b) <= 1 ? reset($b) : join(', ', array_slice($b, 0, -1)) . " & " . end($b); 

1
function fancy_implode($arr){
    array_push($arr, implode(' and ', array_splice($arr, -2)));
    return implode(', ', $arr);
}

我觉得这个更易于阅读/理解和使用

  • 不会修改原始数组
  • 不使用正则表达式,因为如果数组中的字符串包含逗号,则可能失败,可能有一个合理的原因,就像这样:array('衬衫(S、M、L)','裤子(72 x 37、72 x 39)');
  • 分隔符不必与其他解决方案的长度相同

1

strrpos函数可以查找指定字符串的最后一次出现。 $str = '1, 2, 3';

$index = strrpos( $str, ',' ); 
if( $index !== FALSE )
    $str[ $index ] = '&'; 

0
$bedroom_list = implode(", ", array_filter($bedroom_array));

$vars =  $bedroom_list;

$last = strrchr($vars,",");

$last_ = str_replace(",","&",$last);

echo str_replace("$last","$last_",$vars);

0
<?php
$string = "3, 4, 5";
echo $string = preg_replace('/,( \d)$/', ' &\1', $string);
?>

0
这是另一种使用正向预查的正则表达式替换方式,不需要后向引用:
$bedroom_list = preg_replace('/,(?=[^,]*$)/',' &', implode(', ', $bedroom_array));

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