用逗号和字符串PHP分隔数组

时间:2018-09-05 22:02:02

标签: php arrays implode

我想用逗号和单词分隔一个数组。

这是我编写的代码:

$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个。

4 个答案:

答案 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

Or the documentation

答案 3 :(得分:1)

我建议您将问题视为可以进行单元测试的功能,这样可以更轻松地构建并且可以灵活地解决方案。

  • 使用计数器跟踪您的数组:总数,第一块,尾部
  • 考虑任何特殊情况,例如2个元素,3个元素等。
  • 使用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

Working example here


替代

一种处理特殊情况并打印最后一项值的替代方法。

<?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

随时根据需要进行调整。

Working code example