2011-06-14 127 views
4

鉴于以下数组:PHP以形成串,如 “A,B,C,和d” 从数组值

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

感谢您的帮助!

+1

搜索过去','与'和'替换它。 – hakre 2011-06-14 22:49:10

+0

@hakre我可以使用哪些功能? – pepe 2011-06-14 22:51:10

+0

请参阅下面的答案。 – hakre 2011-06-14 23:02:20

回答

3

我想你也许想是这样的,用array_pop下车数组末尾的最后一个元素。然后,您可以破灭阵列的其余部分,并以定制方式添加的最后一个元素:

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

编辑:添加有条件的检查,如果数组只有一个元素。

+1

失败,数组大小为1. – user482594 2011-06-14 22:52:38

+0

@ user482594固定 - 好点。 – lonesomeday 2011-06-14 22:54:54

+0

thx @lonesomeday thx @lonesomeday这对于我想要的完全适用 - 使用一种,两种和三种尺寸进行测试并正常工作确定 – pepe 2011-06-14 23:07:29

2

一个的preg_replace可以寻找最后的命令才刚刚换它向and

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

这种情况在大多数情况下都适用,但如果数组中的最后一项包含逗号,它将会失败。除非可以保证数组永远不会包含带逗号的项目,否则应避免使用此方法。 – 2011-06-14 23:08:46

0

我不知道有一个内置该功能,但这样的事情应该工作。

$last = $car_names[count($car_names)-1]; 
$implodedString = implode(', ', array_values($car_names)) 
$implodedString = str_replace(", $last", "and $last", $implodedString); 
6
$last = array_pop($car_names); 
echo implode(', ', $car_names) . ' AND ' . $last; 
+0

+1。我喜欢。 – joakimdahlstrom 2011-06-14 22:52:39

+1

失败,数组大小为1 – user482594 2011-06-14 22:52:55

+0

+1 - 甜的。 – hakre 2011-06-14 22:53:53

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

这是在我的上述评论评为功能的例子:

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

和代码的RT:

$text = implode(', ', array_values($car_names)); 
$last = strrpos($text, ','); 
if ($last) $text = substr($text, 0, $last-1) . ' AND ' . substr($text, $last+1); 
echo $text; 
0

有很多的,你可以做到这一点的方式。这是另一个。

<?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> 
相关问题