这个数组包含一个项目列表,我想把它变成一个字符串,但我不知道如何让最后一个项目有一个& /而不是昏迷。
1 => coke 2=> sprite 3=> fanta
应该成为
coke, sprite and fanta
这是常规内爆功能:
$listString = implode(', ',$listArrau );
这是一种简单的方法吗?
答案 0 :(得分:95)
适用于任意数量物品的长衬里:
echo join(' and ', array_filter(array_merge(array(join(', ', array_slice($array, 0, -1))), array_slice($array, -1)), 'strlen'));
或者,如果你真的更喜欢冗长:
$last = array_slice($array, -1);
$first = join(', ', array_slice($array, 0, -1));
$both = array_filter(array_merge(array($first), $last), 'strlen');
echo join(' and ', $both);
关键是这个切片,合并,过滤和连接处理所有个案,包括0,1和2项,没有额外的if..else
语句。它恰好可折叠成一个单行。
答案 1 :(得分:67)
我不确定单个班轮是解决这个问题的最佳解决方案。
我刚才写了这篇文章并根据需要删除了它:
/**
* Join a string with a natural language conjunction at the end.
* https://gist.github.com/angry-dan/e01b8712d6538510dd9c
*/
function natural_language_join(array $list, $conjunction = 'and') {
$last = array_pop($list);
if ($list) {
return implode(', ', $list) . ' ' . $conjunction . ' ' . $last;
}
return $last;
}
您不必使用“和”作为您的连接字符串,它非常有效,适用于从0到无限数量项目的任何内容:
// null
var_dump(natural_language_join(array()));
// string 'one'
var_dump(natural_language_join(array('one')));
// string 'one and two'
var_dump(natural_language_join(array('one', 'two')));
// string 'one, two and three'
var_dump(natural_language_join(array('one', 'two', 'three')));
// string 'one, two, three or four'
var_dump(natural_language_join(array('one', 'two', 'three', 'four'), 'or'));
答案 2 :(得分:25)
您可以弹出最后一项,然后将其加入文字:
$yourArray = ('a', 'b', 'c');
$lastItem = array_pop($yourArray); // c
$text = implode(', ', $yourArray); // a, b
$text .= ' and '.$lastItem; // a, b and c
答案 3 :(得分:15)
试试这个:
$str = array_pop($array);
if ($array)
$str = implode(', ', $array)." and ".$str;
答案 4 :(得分:3)
另一种可能的简短解决方案:
$values = array('coke', 'sprite', 'fanta');
$values[] = implode(' and ', array_splice($values, -2));
print implode(', ', $values); // "coke, sprite and fanta"
它适用于任意数量的值。
答案 5 :(得分:2)
我知道迟到的答案,但肯定这是一个更好的方法吗?
$list = array('breakfast', 'lunch', 'dinner');
$list[count($list)-1] = "and " . $list[count($list)-1];
echo implode(', ', $list);
答案 6 :(得分:1)
我的回答,类似于恩里克的回答,但可选择处理牛津逗号。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
<p class=>Not to be changed!</p>
<p class="groupHover">Line 1</p>
<p class="groupHover">Line 2</p>
<p class=>Not to be changed!</p>
<p class="groupHover">Line 3</p>
<p class="groupHover">Line 4</p>
<p class=>Not to be changed!</p>
答案 7 :(得分:0)
试试这个,
<?php
$listArray = array("coke","sprite","fanta");
foreach($listArray as $key => $value)
{
if(count($listArray)-1 == $key)
echo "and " . $value;
else if(count($listArray)-2 == $key)
echo $value . " ";
else
echo $value . ", ";
}
?>
答案 8 :(得分:0)
试试这个
$arr = Array("coke","sprite","fanta");
$str = "";
$lenArr = sizeof($arr);
for($i=0; $i<$lenArr; $i++)
{
if($i==0)
$str .= $arr[$i];
else if($i==($lenArr-1))
$str .= " and ".$arr[$i];
else
$str .= " , ".$arr[$i];
}
print_r($str);
答案 9 :(得分:0)
我根据此页面上的建议对此进行了编码。如果有人需要,我会在评论中留下我的伪代码。我的代码与其他代码不同,因为它以不同的方式处理不同大小的数组,并将牛津逗号表示法用于三个或更多的列表。
/**
* Create a comma separated list of items using the Oxford comma notation. A
* single item returns just that item. 2 array elements returns the items
* separated by "and". 3 or more items return the comma separated list.
*
* @param array $items Array of strings to list
* @return string List of items joined by comma using Oxford comma notation
*/
function _createOxfordCommaList($items) {
if (count($items) == 1) {
// return the single name
return array_pop($items);
}
elseif (count($items) == 2) {
// return array joined with "and"
return implode(" and ", $items);
}
else {
// pull of the last item
$last = array_pop($items);
// join remaining list with commas
$list = implode(", ", $items);
// add the last item back using ", and"
$list .= ", and " . $last;
return $list;
}
}
答案 10 :(得分:0)
现在这已经很老了,但我认为将我的解决方案添加到桩中会有什么不妥。它的代码比其他解决方案多一点,但我对此感到满意。
我想要一些具有一定灵活性的东西,所以我创建了一个实用程序方法,允许设置最终分隔符应该是什么(例如,你可以使用&符号)以及是否使用牛津逗号。它还可以正确处理包含0,1和2项的列表(这里有很多答案都没有)
$androidVersions = ['Donut', 'Eclair', 'Froyo', 'Gingerbread', 'Honeycomb', 'Ice Cream Sandwich', 'Jellybean', 'Kit Kat', 'Lollipop', 'Marshmallow'];
echo joinListWithFinalSeparator(array_slice($androidVersions, 0, 1)); // Donut
echo joinListWithFinalSeparator(array_slice($androidVersions, 0, 2)); // Donut and Eclair
echo joinListWithFinalSeparator($androidVersions); // Donut, Eclair, Froyo, Gingerbread, Honeycomb, Ice Cream Sandwich, Jellybean, Kit Kat, Lollipop, and Marshmallow
echo joinListWithFinalSeparator($androidVersions, '&', false); // Donut, Eclair, Froyo, Gingerbread, Honeycomb, Ice Cream Sandwich, Jellybean, Kit Kat, Lollipop & Marshmallow
function joinListWithFinalSeparator(array $arr, $lastSeparator = 'and', $oxfordComma = true) {
if (count($arr) > 1) {
return sprintf(
'%s%s %s %s',
implode(', ', array_slice($arr, 0, -1)),
$oxfordComma && count($arr) > 2 ? ',':'',
$lastSeparator ?: '',
array_pop($arr)
);
}
// not a fan of this, but it's the simplest way to return a string from an array of 0-1 items without warnings
return implode('', $arr);
}
答案 11 :(得分:0)
好的,所以这已经很老了,但我不得不说我认为大多数答案都非常低效,有多个内爆或数组合并等等,所有这些都比必要的IMO复杂得多。
为什么不呢:
implode(',', array_slice($array, 0, -1)) . ' and ' . array_slice($array, -1)[0]
答案 12 :(得分:0)
使用正则表达式简单human_implode。
function human_implode($glue = ",", $last = "y", $elements = array(), $filter = null){
if ($filter) {
$elements = array_map($filter, $elements);
}
$str = implode("{$glue} ", $elements);
if (count($elements) == 2) {
return str_replace("{$glue} ", " {$last} ", $str);
}
return preg_replace("/[{$glue}](?!.*[{$glue}])/", " {$last}", $str);
}
print_r(human_implode(",", "and", ["Joe","Hugh", "Jack"])); // => Joe, Hugh and Jack
答案 13 :(得分:0)
可以使用array_fill
和array_map
完成此操作。它也是一个单行(似乎很多人喜欢它们)),但为了可读性而形成:
$string = implode(array_map(
function ($item, $glue) { return $item . $glue; },
$array,
array_slice(array_fill(0, count($array), ', ') + ['last' => ' and '], 2)
));
不是最佳解决方案,但不过。
这是the demo。
答案 14 :(得分:0)
我想出了另一个解决方案,尽管稍微有些冗长。在我的情况下,我想使数组中的单词复数,因此这将在每个项目的末尾添加一个“ s”(除非单词已经以“ s”结尾:
$models = array("F150","Express","CR-V","Rav4","Silverado");
foreach($models as $k=>$model){
echo $model;
if(!preg_match("/s|S$/",$model))
echo 's'; // add S to end (if it doesn't already end in S)
if(isset($models[$k+1])) { // if there is another after this one.
echo ", ";
if(!isset($models[$k+2]))
echo "and "; // If this is next-to-last, add ", and"
}
}
}
输出:
F150s, Express, CR-Vs, Rav4s, and Silverados
答案 15 :(得分:-1)
它比deceze的解决方案更快,并且可以使用大型数组(1M +元素)。两个解决方案的唯一缺陷是由于使用了array_filter而在少于三个元素的数组中与数字0的交互不良。
echo implode(' and ', array_filter(array_reverse(array_merge(array(array_pop($array)), array(implode(', ',$array))))));