2011-06-14 59 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> 
相關問題