【问题标题】:PHP to form string like "A, B, C, and D" from array valuesPHP从数组值形成字符串,如“A、B、C和D”
【发布时间】:2011-06-14 22:47:45
【问题描述】:

给定以下数组:

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,但我不确定这是要走的路(即在数组中插入一个新元素)。

感谢您的帮助!

【问题讨论】:

  • 搜索最后一个 , 并将其替换为 and
  • @hakre 我可以使用什么功能?

标签: php arrays implode array-splice


【解决方案1】:
$last = array_pop($car_names);
echo implode(', ', $car_names) . ' AND ' . $last;

【讨论】:

  • 这会失败,数组大小为 1
  • @user482594 确实如此,但你明白了,不是吗? SO的想法是不提供完整的代码
  • @Teneff 是的,但用户可能会选择提供工作代码的答案..
  • 感谢大家的支持和投票,user482594 在技术上是正确的,哪种是最好的正确?
【解决方案2】:

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

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

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

【讨论】:

  • 这会失败,数组大小为 1。
  • thx @lonesomeday 这非常适合我想要的东西 - 用 1、2 和 3 尺寸进行了测试并且工作正常
  • 对此有一点需要注意,array_pop 会从数组中删除最后一个值,因此如果您稍后需要该数组,它将丢失一项。对此的解决方案是将其移动到一个函数中,这样当数组作为参数传入时,您将使用 $car_names 的副本,而不是直接使用原始数组。
【解决方案3】:

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

$yourString = preg_replace( "/, ([\w#]*)$/", "and \1", $yourString );

【讨论】:

  • 这种事情在大多数情况下都有效,但如果数组中的最后一项包含逗号,它将失败。除非您可以保证数组中永远不会包含带有逗号的项目,否则应避免使用此方法。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    我不确定是否有为此的内置函数,但这样的东西应该可以工作。

    $last = $car_names[count($car_names)-1];
    $implodedString = implode(', ', array_values($car_names))
    $implodedString = str_replace(", $last", "and $last", $implodedString);
    

    【讨论】:

      【解决方案6】:

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

      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;
      

      【讨论】:

        【解决方案7】:

        您可以通过多种方式做到这一点。这是另一个。

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

        输出

        <p>Car #1, Car #2, Car #3 and Array</p>
        <p>Car #1 and Car #2</p>
        <p>Car #1</p>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-27
          • 1970-01-01
          相关资源
          最近更新 更多