2009-06-18 2 views
3

Если у меня есть массив, который выглядит следующим образом:Как я могу отобразить массив в человекообразном формате?

$str = ''; 
if($_POST['first']) 
    $str = $_POST['first']; 
if($_POST['second']) 
    $str .= ($str != '' ? ',' : '') . $_POST['second']; 
if($_POST['third']) 
    $str .= ($str != '' ? ',' : '') . $_POST['third']; 
if($_POST['fourth']) 
    $str .= ($str != '' ? ',' : '') . $_POST['second']; 
$str .= ($str != '' ? '.' : ''); 

Который дает мне что-то вроде этого:

Джо, Адам, Майк.

Тем не менее, я хотел бы добавить «и» перед последним товаром.

Так будет гласить:

Джо, Адам, и Майк.

Как я могу изменить свой код, чтобы сделать это?

ответ

10

Массивы являются удивительными для этого:

$str = array(); 
foreach (array('first','second','third','fourth') as $k) { 
    if ($_POST[$k]) { 
     $str[] = $k; 
    } 
} 
$last = array_pop($str); 
echo implode(", ", $str) . " and " . $last; 

Вы должны, вероятно, особый случай выше, когда есть один пункт. Я, на самом деле, написал функцию под названием «конъюнкция», которая делает выше, и включает в себя особый случай:

function conjunction($x, $c="or") 
{ 
    if (count($x) <= 1) { 
     return implode("", $x); 
    } 
    $ll = array_pop($x); 
    return implode(", ", $x) . " $c $ll"; 
} 

Хороший вопрос!

Обновлено: путь общего назначения, чтобы сделать это:

function and_form_fields($fields) 
{ 
    $str = array(); 
    foreach ($fields as $k) { 
     if (array_key_exists($k, $_POST) && trim($_POST[$k])) { 
       $str[] = $k; 
     } 
    } 
    return conjunction($str, "and"); 
} 

... 

and_form_fields(array("Name_1","Name_2",...)); 

Я добавил правильный $ проверки, чтобы избежать уведомления _POST и пустые значения.

+1

Plus ваши рифмы определения функции: P – alex

+0

выше только возвращает: первый, второй, третий и четвертый Я хотел бы добавить последнюю запятую, часто называемую серийной запятой. Как изменить этот массив, чтобы выполнить это? Спасибо, ребята! – 2009-06-18 05:21:55

+0

Я думаю, что серийная запятая технически неверна, но просто измените последнюю строку на: ", и". $ last -OR-- ", $ c $ ll"; B – razzed

0

Первый идеал, который приходит мне на ум, всегда должен содержать последнее имя в альтернативном варианте. Когда у вас есть еще один, чтобы положить его, вы берете его, чтобы поставить «запятую» и получить следующее имя в aux.

В конце, когда вы закончили добавлять имена, вы добавляете 'and' и фамилию из aux.

0

Вместо размещения каждого в отдельной переменной, то почему бы не размещать их в виде массива:

#pull the array from the POST: 
$postedarray = $_POST['names']; 

#count the number of elements in the posted array: 
$numinarray = count($postedarray); 

#subtract 1 from the number of elements, because array elements start at 0 
$numinarray = $numinarray -1; 

#set a prepend string 
$prependstr = "and "; 

#Pull the last element of the array 
$lastname = $postedarray[$numinarray]; 

#re-define the last element to contan the prepended string 
$postedarray[$numinarray] = "$prependstr$lastname"; 

#format the array for your requested output 
$comma_separated = implode(", ", $postedarray); 

print "$comma_separated";