用“,”排列数组,在最后一项之前加上“和”

这个数组包含一个项目列表,我想把它变成一个string,但是我不知道如何让最后一个项目有一个&而不是之前的昏迷。

1 => coke 2=> sprite 3=> fanta 

应该成为

 coke, sprite and fanta 

这是正常的内爆function:

 $listString = implode(', ',$listArrau ); 

什么是一个简单的方法来做到这一点?

与任何数量的物品一起使用的长衬垫:

 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语句。 它恰好可以折叠成一行。

我不确定一个class轮是这个问题最优雅的解决scheme。

我前一段时间写了这个,按照需要放入:

 /** * 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; } 

您不必使用“和”作为连接string,它的效率很高,可以处理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')); 

你可以popup最后一个项目,然后join文本:

 $yourArray = ('a', 'b', 'c'); $lastItem = array_pop($yourArray); // c $text = implode(', ', $yourArray); // a, b $text .= ' and '.$lastItem; // a, b and c 

尝试这个:

 $str = array_pop($array); if ($array) $str = implode(', ', $array)." and ".$str; 

另一个可能的简短解

 $values = array('coke', 'sprite', 'fanta'); $values[] = implode(' and ', array_splice($values, -2)); print implode(', ', $values); // "coke, sprite and fanta" 

它适用于任何数量的值。

我知道我迟到了,但肯定这是一个更好的办法吗?

 $list = array('breakfast', 'lunch', 'dinner'); $list[count($list)-1] = "and " . $list[count($list)-1]; echo implode(', ', $list); 

尝试这个

 $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); 

尝试这个,

 <?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 . ", "; } ?> 

我刚刚根据本页上的build议对此进行了编码。 我留在我的伪代码的意见,以防万一需要它。 我的代码与这里的其他代码不同,因为它处理不同大小的数组的方式不同,并使用牛津逗号表示来表示三个或更多的列表。

  /** * 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; } } 

在这一点上,这已经相当老了,但我认为把我的解决scheme添加到堆中并不是什么坏事。 这是比其他解决scheme更多的代码,但我没有问题。

我想要一些灵活性的东西,所以我创build了一个实用程序方法,允许设置最终的分隔符(例如,可以使用&符号)以及是否使用牛津逗号。 它也正确地处理与0,1和2项目的列表(这里的答案不less)

 $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); } 

好的,所以这是越来越老,但我不得不说,我认为大多数的答案是非常低效的多个内爆或数组合并,像这样的东西,远远比IMO所需要的更复杂。

为什么不只是:

 implode(',', array_slice($array, 0, -1)) . ' and ' . array_slice($array, -1)[0] 

这是更快,然后欺骗的解决scheme和巨大的数组(1M +元素)的作品。 这两个解决scheme的唯一缺陷是由于array_filter的使用,与less于三个元素数组中的数字0的交互性差。

 echo implode(' and ', array_filter(array_reverse(array_merge(array(array_pop($array)), array(implode(', ',$array))))));