Как взорвать foreach - PullRequest
       5

Как взорвать foreach

3 голосов
/ 02 сентября 2010

Как взорвать foreach() запятой?

foreach($names as $name) {
    //do something
    echo '<a href="' . $url . '" title="' . $title . '">' . $name .'</a>';
}

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

Ответы [ 6 ]

25 голосов
/ 02 сентября 2010

Решение Раверена эффективно и красиво, но вот еще одно решение (которое может быть полезно в подобных сценариях):

$elements = array();
foreach($names as $name) {
    //do something
    $elements[] = '<a href="' . $url . '" title="' . $title . '">' . $name .'</a>';
}
echo implode(',', $elements);
12 голосов
/ 02 сентября 2010

Вам нужно преобразовать свой массив вместо итерации с помощью foreach. Вы можете сделать это с помощью array_map.

Синтаксис PHP 5.3 с замыканиями

echo implode(", ", array_map(function($name) use($url, $title)
{
    return '<a href="' . $url . '" title="' . $title . '">' . $name .'</a>';
}, $names));

Совместимый синтаксис до PHP 5.3

function createLinkFromName($name)
{
    return '<a href="' . $url . '" title="' . $title . '">' . $name .'</a>';
}
echo implode(", ", array_map('createLinkFromName', $names));

Синтаксис PHP 5.3 с лучшей надежностью

function a_map($array, $function)
{
    return array_map($function, $array);
}

echo implode(", ", a_map($names, function($name) use($url, $title)
{
    return '<a href="' . $url . '" title="' . $title . '">' . $name .'</a>';
}));
2 голосов
/ 02 сентября 2010
$s = '';
foreach ($names as $name) {
  if ($s) $s .= ', ';
  $s .= '<a href="' . $url . '" title="' . $title . '">' . $name . '</a>';
}
2 голосов
/ 02 сентября 2010
$first = TRUE;
foreach($names as $name) {
    //do something
    if(!$first) { echo ', '; }
    $first = FALSE;
    echo '<a href="', $url, '" title="', $title, '">', $name, '</a>';
}
2 голосов
/ 02 сентября 2010
foreach($names as $name) {
    //do something
    $str .= '<a href="' . $url . '" title="' . $title . '">' . $name .'</a>,';
}
echo substr($str,0,-1);

EDIT: Как отмечается в комментариях, этот способ действий немного подвержен ошибкам, если вы измените разделитель (точно его длину) и забудете параметр substr. Поэтому используйте метод foreach, если производительность не является абсолютно критичной.

1 голос
/ 02 сентября 2010

Вот ужасное решение, использующее echo:

 $total = (count($names) - 1 );

 foreach($names as $i => $name) 
 {
      if($i != $total) 
           echo '<a href="' . $url . '" title="' . $title . '">' . $name .'</a>, ';
      else
           echo '<a href="' . $url . '" title="' . $title . '">' . $name .'</a>';
 }
...