PHP цикл, изменить последний элемент? - PullRequest
1 голос
/ 11 декабря 2010

Это может быть на самом деле вопрос CSS, но я надеюсь, что нет, потому что я хотел бы, чтобы это работало в IE.

У меня есть следующий цикл:

<?php 
  if ($category)
{
     foreach($category as $item)
         {
               echo $item['name'];
               echo ", ";
         }
} ?>

Что должноoutput

item, item, item, item,

Единственное, что ... Я бы не хотел ставить запятую после последнего элемента.Есть ли способ сделать это в цикле?

Ответы [ 8 ]

7 голосов
/ 11 декабря 2010

Ну, чтобы сохранить ваш код таким, какой он есть, вы можете добавить счетчик и пропустить последний.

<?php 
if ($category) {
     $counter = 0;
     foreach($category as $item)
         {
               $counter++;
               echo $item['name'];
               if ($counter < count($category)) {
                   echo ", ";
               }
         }
}
?>

Или вы можете сделать это намного, намного, быстрее:

<?php echo implode(", ", array_map(create_function('$item', 'return $item["name"];'), $category)); ?>
4 голосов
/ 11 декабря 2010

Не выводите эхо сразу, но сохраните вывод в переменную, которую вы можете обрезать.

<?php 
if ($category) {
    $output = '';
    foreach($category as $item) {
           $output .= $item['name'];
           $output .= ", ";
    }
    echo rtrim($output, ', ');
} 
?>
2 голосов
/ 11 декабря 2010

Решение implode самое простое, но вы запросили цикл. Этот метод позволяет избежать добавления дополнительных условий в цикл и поэтому должен быть несколько более эффективным. По сути, вместо того, чтобы делать что-то другое для последнего элемента, вы делаете что-то другое для первого элемента.

$myArray = array(); //Fill with whatever
$result = $myArray[0];
for ($idx = 1; $idx < count($myArray); $idx += 1)
{
    $result .= ', ' . $myArray[$idx];
}

РЕДАКТИРОВАТЬ: После реализации вы хотите, чтобы $ item ['name'], а не просто $ item:

$myArray = array(); //Fill with whatever
$result = $myArray[0]['name'];
for ($idx = 1; $idx < count($myArray); $idx += 1)
{
    $result .= ', ' . $myArray[$idx]['name'];
}
1 голос
/ 11 декабря 2010

Стандартное решение проблемы «последней запятой» состоит в том, чтобы поместить элементы в массив и затем сжать его:

 $temp = array();
 foreach($category as $item)
    $temp[] =  $item['name'];
 echo implode(', ', $temp);

Если вы хотите, чтобы это было более универсальным, вы также можете написать функцию, которая выбирает («собирает») определенное поле из каждого подмассива:

  function array_pluck($ary, $key) {
     $r = array();
     foreach($ary as $item)
         $r[] = $item[$key];
     return $r;
  }

, а затем просто

  echo implode(', ', array_pluck($category, 'name'));
1 голос
/ 11 декабря 2010

Предполагая, что $category является массивом, вы можете использовать implode , чтобы получить то, что вы хотите:

Редактировать: Пропущена часть $ Categories ['name'], это должно работать:

<?php implode(", ", array_keys($category, 'name')); ?>
1 голос
/ 11 декабря 2010

Как мило, как foreach, ...

<?php
if ($category) {
     $count = count($category) - 1;
     for ($i = 0; $i <= $count; $i++) {
         echo $category[$i]['name'];
         if ($i < $count)
             echo ', ';
     }
}
?>

... for иногда необходимо.

0 голосов
/ 11 декабря 2010

Или вы можете проверить последний ключ:

end($category);
$lastkey = key($category);
foreach ( $category AS $key => $item ) {
  echo $item['name'];
  if ( $lastkey != $key ) {
    echo ', ';
  }
}
0 голосов
/ 11 декабря 2010

И еще один вариант:

<?php 
$out = "";

foreach ($category as $item)
    {
    $out .= $item['name']. ", ";
    }

$out = preg_replace("/(.*), $/", "$1", $out);
echo $out;
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...