我想用逗号和单词分隔一个数组。
这是我编写的代码:
$array = array( 'user1', 'user2', 'user3', 'user4', 'user5' );
$last = array_pop( $array );
$string = count( $array ) ? implode( ", ", $array ) . " and " . $last : $last;
printf( 'Authors: %s', $string );
我的代码打印此:
作者:user1,user2,user3,user4和user5
我成功编写了一个代码,用逗号将数组内插,并搜索最后一个键,并用单词“ and”将其分隔。
但这就是我想要的,但是经过2天以上的努力后,我失败了:
作者:user1,user2和user3以及另外2个。
答案 0 :(得分:2)
这里是一种方法:
首先内爆前两个数组元素。 (array_splice
将从$array
中删除它们。)
$string = implode(', ', array_splice($array, 0, 2));
添加第三个(如果有)。 (array_shift
也将从$array
中删除。)
if ($array) {
$string .= ', and ' . array_shift($array);
}
计算其余部分,如果有剩余,将其添加。
if ($n = count($array)) {
$string .= " and $n other". ($n > 1 ? 's' : '');
// conditional pluralization
}
答案 1 :(得分:2)
尽管我一直在寻找巧妙的计算流程来处理此类任务,但我将提供更多行人选择。 (为记录起见,我讨厌他们编写if-elseif-else
条件的电池,几乎等于我讨厌switch-case
块的冗长程度。)对于这个狭窄的任务,我选择放弃我喜欢的数组函数,并使用其自定义的分隔符有条件地打印值。
尽管此解决方案在页面上的可扩展性最低,但它可能是最容易理解的(将代码与其生成的输出相关联)。如果这是关于“赞”之类的东西,我对可伸缩性的需求并不大,但是我可能错了。
请密切注意2位数情况。我的解决方案使用and
而不是,
来分隔元素,这似乎更适合英语/人类。
代码:(Demo)
$arrays[] = array();
$arrays[] = array('user1');
$arrays[] = array('user1', 'user2');
$arrays[] = array('user1', 'user2', 'user3');
$arrays[] = array('user1', 'user2', 'user3', 'user4');
$arrays[] = array('user1', 'user2', 'user3', 'user4', 'user5');
foreach ($arrays as $i => $array) {
echo "TEST $i: ";
if (!$count = sizeof($array)) {
echo "nobody";
} elseif ($count == 1) {
echo $array[0];
} elseif ($count == 2) {
echo "{$array[0]} and {$array[1]}";
} elseif ($count == 3) {
echo "{$array[0]}, {$array[1]}, and {$array[2]}";
} else {
echo "{$array[0]}, {$array[1]}, {$array[2]}, and " , $count - 3, " other" , ($count != 4 ? 's' : '');
}
echo "\n---\n";
}
输出:
TEST 0: nobody
---
TEST 1: user1
---
TEST 2: user1 and user2
---
TEST 3: user1, user2, and user3
---
TEST 4: user1, user2, user3, and 1 other
---
TEST 5: user1, user2, user3, and 2 others
---
p.s。相同处理方式的更紧凑版本:
代码:(Demo)
if (!$count = sizeof($array)) {
echo "nobody";
} elseif ($count < 3) {
echo implode(' and ', $array);
} else{
echo "{$array[0]}, {$array[1]}";
if ($count == 3) {
echo ", and {$array[2]}";
} else {
echo ", {$array[2]}, and " , $count - 3, " other" , ($count != 4 ? 's' : '');
}
}
最后,这是一种“整理”数组并将and
附加到最终元素的方法。我认为无论如何旋转此任务,都会有一定程度的卷积。
代码:(Demo)
$count = sizeof($array);
if ($count < 3) {
echo implode(' and ', $array);
} else {
if ($count == 3) {
$array[2] = "and {$array[2]}";
} else {
$more = $count - 3;
array_splice($array, 3, $more, ["and $more other" . ($more > 1 ? 's' : '')]);
}
echo implode(', ', $array);
}
答案 2 :(得分:1)
有几种方法,一种简单的方法:
首先,您应该获取数组中元素的数量,以查看它是否大于3。
$count = count( $array) ;
然后,如果大于3,则可以输入字符串:
if($count>3){
$string= $array[0] . 'and' . $array[1] . 'and' . $array[2] . 'and' . ($count - 3) . "others";
}else{
$last = array_pop( $array );
$string = count( $array ) ? implode( ", ", $array ) . " and " . $last : $last;
//I used exactly your code , you have several ways to do it
//Attention ... This code may not work when your array has only one element
}
printf( 'Authors: %s', $string );
If you want to know more about PHP arrays you can use this link , a quick tutorial
答案 3 :(得分:1)
我建议您将问题视为可以进行单元测试的功能,这样可以更轻松地构建并且可以灵活地解决方案。
array_pop
array_slice
从“ take N”参数中获取第一个块。这里有一个例子。
<?php
function niceAuthorsPrint(array $authors, $takeCount){
$totalAuthors = count( $authors );
$tailCount = $totalAuthors - $takeCount;
$first = array_slice($authors, 0, $takeCount);
$othersLabel = $tailCount == 1 ? 'other' : 'others';
$string = implode( ", ", $first );
if($tailCount > 0){
$string .= " and " . $tailCount . ' ' . $othersLabel;
}
return $string;
}
// take 3
echo niceAuthorsPrint(array( 'user1', 'user2', 'user3', 'user4', 'user5' ), 3) ."\n";
// take 4
echo niceAuthorsPrint(array( 'user1', 'user2', 'user3', 'user4', 'user5' ), 4) ."\n";
// take 5
echo niceAuthorsPrint(array( 'user1', 'user2', 'user3', 'user4', 'user5' ), 5) ."\n";
?>
将输出:
user1, user2, user3 and 2 others
user1, user2, user3, user4 and 1 other
user1, user2, user3, user4, user5
一种处理特殊情况并打印最后一项值的替代方法。
<?php
// array of authors, number of authors to take first
function niceAuthorsPrint(array $authors, $takeCount){
$totalAuthors = count( $authors );
if($totalAuthors >= 3 && $takeCount >= $totalAuthors)
{
$takeCount = 2;
}
if($totalAuthors == 2 && $takeCount >= $totalAuthors)
{
$takeCount = 1;
}
$last = array_pop($authors);
$tailCount = $totalAuthors - $takeCount;
$first = array_slice($authors, 0, $takeCount);
$othersLabel = $tailCount == 1 ? $last : $tailCount . ' others';
$string = implode( ", ", $first );
if($tailCount > 0){
$string .= " and " . $othersLabel;
}
return $string;
}
// take 3
echo niceAuthorsPrint(array( 'user1', 'user2', 'user3', 'user4', 'user5' ), 3) ."\n";
// take 4
echo niceAuthorsPrint(array( 'user1', 'user2', 'user3', 'user4', 'user5' ), 4) ."\n";
// take 5
echo niceAuthorsPrint(array( 'user1', 'user2', 'user3', 'user4', 'user5' ), 5) ."\n";
// take original count, take first three as default
echo niceAuthorsPrint(array( 'user1', 'user2', 'user3', 'user4', 'user5' ), 5) ."\n";
// take original count, take first three as default
echo niceAuthorsPrint(array( 'user1', 'user2', 'user3'), 3) ."\n";
// take original count, take first three as default
echo niceAuthorsPrint(array( 'user1', 'user2'), 2) ."\n";
将打印:
user1, user2, user3 and 2 others
user1, user2, user3, user4 and user5
user1, user2 and 3 others
user1, user2 and 3 others
user1, user2 and user3
user1 and user2
随时根据需要进行调整。