Как использовать цикл foreach, но делать что-то другое на последней итерации? - PullRequest
6 голосов
/ 03 декабря 2009

Вероятно, это простой вопрос, но как вы перебираете массив, что-то делаете с каждым, до последнего и делаете что-то другое?

У меня есть массив имен. Я хочу вывести список имен, разделенных запятыми.

Джо, Боб, Фубар

Мне не нужна запятая в конце фамилии в массиве, а также если в массиве только одно значение (или его нет!).

Обновление: Я не могу использовать implode(), потому что у меня есть массив объектов модели User, где я получаю имя от каждого объекта.

$users = array();
$users[] = new User();

foreach ($users as $user) {
    echo $user->name;
    echo ', ';
}

Как я могу достичь этого и при этом использовать эти объекты?

Обновление: Я слишком беспокоился о том, сколько строк кода я вставил в свой скрипт вида, поэтому я решил вместо этого создать помощник вида. Вот что я закончил:

$array = array();
foreach($users as $user) {
    $array[] = $user->name;
}
$names = implode(', ', $array);

Ответы [ 8 ]

15 голосов
/ 03 декабря 2009

Использование implode:

$names = array('Joe', 'Bob', 'Foobar');
echo implode(', ', $names); # prints: Joe, Bob, Foobar

Чтобы уточнить, если в массиве только один объект, разделитель ', ' вообще не будет использоваться, и будет возвращена строка, содержащая один элемент.

РЕДАКТИРОВАНИЕ: Если у вас есть массив объектов, и вы хотите сделать это иначе, чем цикл for с тестами, вы можете сделать это:

function get_name($u){ return $u->name; };
echo implode(', ', array_map('get_name', $users) ); # prints: Joe, Bob, Foobar
6 голосов
/ 03 декабря 2009
$array = array('joe', 'bob', 'Foobar');
$comma_separated = join(",", $array);

вывод:

joe,bob,Foobar

3 голосов
/ 03 декабря 2009

Иногда вы можете не захотеть использовать имплозу. Хитрость заключается в том, чтобы использовать вспомогательную переменную для отслеживания не последнего, а первого цикла. визави:

$names = array('Joe', 'Bob', 'Foobar');
$first = true;
$result = '';
foreach ($names as $name)
{
   if (!$first)
      $result .= ', ';
   else
      $first = false;

   $result .= $name;
}
1 голос
/ 03 декабря 2009

Я часто сталкиваюсь с этим, создавая SQL-операторы и т. Д.

$joiner = " ";
foreach ($things as $thing) {
    echo "  $joiner $thing \n";
    $joiner = ',';
}

По какой-то причине легче выработать логику, если вы думаете о «,», «И» или «ИЛИ» как о параметре / атрибуте, который идет перед элементом. Тогда возникает проблема, как подавить «,» в первой строке.

1 голос
/ 03 декабря 2009

psuedocode ....

integer sigh=container.getsize();
sigh--;
integer gosh=0;
foreach element in container
{
  if(gosh!=sigh)
    dosomething();
  else 
    doLastElementStuff();
  gosh++;
}

Глядя на все остальные ответы, кажется, что PHP стал более синтаксическим с тех пор, как я в последний раз что-то писал в нем: D

1 голос
/ 03 декабря 2009

implode(', ', $array_of_names)

0 голосов
/ 03 декабря 2009

На самом деле мне проще создавать текст с разделителями-запятыми немного по-другому. Это немного более многословно, но меньше вызовов функций.

<?php

$nameText = '';
for ($i = 0; $i < count($nameArray); $i++) {
    if ($i === 0) {
        $nameText = $nameArray[$i];
    } else {
        $nameText .= ',' . $nameArray[$i];
    }
}

Добавляет запятую в качестве префикса к каждому имени, кроме случаев, когда это первый элемент массива. Я полюбил использовать для в отличие от foreach , поскольку у меня есть легкий доступ к текущему индексу и, следовательно, к смежным элементам массива. Вы можете использовать foreach примерно так:

<?php

$nameText = '';
$nameCounter = 0;
foreach ($nameArray as $thisName) {
    if ($nameCounter === 0) {
        $nameText = $thisName;
        $nameCounter++;
    } else {
        $nameText .= ',' . $thisName;
    }
}
0 голосов
/ 03 декабря 2009

Лично я нашел самый быстрый способ (если вы увлекаетесь микрооптимизацией):

  if(isset($names[1])) {
     foreach ($names as $name) {
       $result .= $name . ', ';
    }
    $result = substr($result, 0, -2);
  } else {
    $result = $names[0];
  }

isset($names[1]) - самый быстрый (хотя и не очень понятный) способ проверки длины массива (или строки). В этом случае выполняется проверка как минимум двух элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...