4

给定以下数组:

Array
(
    [143] => Car #1
    [144] => Car #2
    [145] => Car #3
)

我目前正在使用这个

implode(', ', array_values($car_names))

生成一个字符串

1 号车、2 号车、3 号车

我想真正得到类似的东西

1 号车、2 号车和 3 号车

这个想法是在数组的最后两个元素之间插入“和” 。

如果数组恰好包含两个键/值对(例如,用户有 2 辆汽车),则不会有逗号。

1 号车和 2 号车

如果数组包含一个键/值(例如,用户有 1 辆车)

1号车

任何建议如何完成这项工作?我尝试使用array_splice,但我不确定这是要走的路(即,将一个新元素插入到数组中)。

感谢您的帮助!

4

7 回答 7

6
$last = array_pop($car_names);
echo implode(', ', $car_names) . ' AND ' . $last;
于 2011-06-14T22:50:54.023 回答
3

我想你可能想要这样的东西,array_pop用来获取数组末尾的最后一个元素。然后,您可以内爆数组的其余部分,并以自定义方式添加最后一个元素:

$last_value = array_pop($car_names);
$output = implode(', ', array_values($car_names));
$output .= ($output ? ' and ' : '') . $last_value;

编辑:添加条件以检查数组是否只有一个元素。

于 2011-06-14T22:51:37.960 回答
2

这个解决方案有点长,但是针对所有阵列大小进行了测试,它是一个完整的解决方案。此外,它不会像上面的答案那样修改数组,而是分成一个函数。

function arrayToString($arr) {
    $count = count($arr);
    if ($count <= 2) {
        return implode(' and ', $arr);
    }
    $result = '';
    $i = 0;
    foreach ($arr as $item) {
        if ($i) $result .= ($i == $count - 1) ? ' and ' : ', ';
        $result .= $item;
        $i++;
    }
    return $result;
}

具有丑陋格式并忽略初始化变量等良好实践的压缩版本:

function arrayToString($arr) {
    if (count($arr) <= 2) return implode(' and ', $arr);
    foreach ($arr as $item) {
        if ($i) $result .= ($i == count($arr) - 1) ? ' and ' : ', ';
        $result .= $item; $i++;
    }
    return $result;
}
于 2011-06-14T22:58:08.113 回答
2

preg_replace 可以查找最后一个命令,只需将其交换为and

$yourString = preg_replace( "/, ([\w#]*)$/", "and \1", $yourString );
于 2011-06-14T22:50:44.613 回答
0

There are a number of ways you could do this. Here's another.

<?php
$cars = array('Car #1', 'Car #2', 'Car #3', 'Car #4');
$car = array('Car #1');
$twocars = array('Car #1', 'Car #2');

function arrayToText($arr) {
    switch (count($arr)) {
    case 1:
        return $arr[0];
        break;
    case 2:
        return implode($arr, ' and ');
        break;
    default:
        $last = array_pop($arr);
        return implode($arr, ', ') . ' and ' . $last;
        break;
    }
}

echo '<p>' . arrayToText($cars) . "</p>\n";
echo '<p>' . arrayToText($twocars) . "</p>\n";
echo '<p>' . arrayToText($car) . "</p>\n";

Output

<p>Car #1, Car #2, Car #3 and Array</p>
<p>Car #1 and Car #2</p>
<p>Car #1</p>
于 2011-06-14T23:32:06.847 回答
0

这是我上面评论中命名的函数的示例:

  1. strrpos()- 查找字符串中子字符串最后一次出现的位置
  2. substr()- 返回字符串的一部分

和代码:

$text = implode(', ', array_values($car_names));
$last = strrpos($text, ',');
if ($last) $text = substr($text, 0, $last-1) . ' AND ' . substr($text, $last+1);
echo $text;
于 2011-06-14T22:58:22.200 回答
0

我不确定是否有内置功能,但这样的东西应该可以工作。

$last = $car_names[count($car_names)-1];
$implodedString = implode(', ', array_values($car_names))
$implodedString = str_replace(", $last", "and $last", $implodedString);
于 2011-06-14T22:50:51.957 回答