PHP - при использовании foreach для перебора массива, как я могу определить, что я нахожусь на последней паре?

Я пытаюсь "красиво распечатать" массив, используя такой синтаксис:

$outString = "[";
foreach($arr as $key=>$value) {
    // Do stuff with the key + value, putting the result in $outString.
    $outString .= ", ";
}
$outString .= "]";

Однако очевидным недостатком этого метода является то, что он покажет "," в конце распечатать массив, перед закрытием "]". Есть ли хороший способ использовать синтаксис $ key => $ value, чтобы определить, находитесь ли вы на последней паре в массиве, или мне следует переключиться на цикл, используя вместо этого each () ?

6
задан Stephen 18 August 2010 в 12:31
поделиться

8 ответов

Создайте массив, а затем используйте implode :

$parts = array();
foreach($arr as $key=>$value) {
    $parts[] = process($key, $value);
}

$outString = "[". implode(", ", $parts) . "]";
12
ответ дан 8 December 2019 в 03:38
поделиться

Вы можете просто обрезать последний символ ",", когда for завершается, используя подстроку.

$outString = "[";
foreach($arr as $key=>$value) {
  // Do stuff with the key + value, putting the result in $outString.
  $outString .= ", ";
 }

 $outString = substr($outString,-2)."]";  //trim off last ", "
4
ответ дан 8 December 2019 в 03:38
поделиться

Выполните обработку отдельно, а затем используйте implode () для соединения:

$outArr = array();
foreach($arr as $key => $value) {
    $outArr[] = process($key, $value);
}
$outString = '[' . implode(', ', $outArr) . ']';
4
ответ дан 8 December 2019 в 03:38
поделиться

Независимо от обстоятельств вашего примера (объединение строк запятыми, для которых implode - правильный способ решения этой проблемы), чтобы ответить на ваш конкретный вопрос, канонический способ перебрать массив и проверить если вы находитесь на последнем элементе, используется CachingIterator :

<?php
$array = array('k'=>'v', 'k1'=>'v1');

$iter = new CachingIterator(new ArrayIterator($array));
$out = '';
foreach ($iter as $key=>$value) {
    $out .= $value;

    // CachingIterator->hasNext() tells you if there is another
    // value after the current one.
    if ($iter->hasNext()) {
        $out .= ', ';
    }
}
echo $out;
3
ответ дан 8 December 2019 в 03:38
поделиться

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

$first= true;
foreach ($arr as $key => $value) {
    if (! $first) {
        $outString .=', ';
    } else {
      $first = false;
    }

    //add stuff to $outString
}

Является ли выходной формат JSON? В таком случае вы могли бы вместо этого использовать json_encode () .

2
ответ дан 8 December 2019 в 03:38
поделиться

Вы можете сделать это как обычный цикл for:

$outString = "[";
for ($i = 0; $i < count($arr); $i++) {
   // Do stuff
   if ($i != count($arr) - 1) {
      $outString += ", ";
   }
 }

Однако, самый хороший способ сделать это, IMHO, это хранить все компоненты в массиве, а затем имплодировать:

 $outString = '[' . implode(', ', $arr) . ']';

implode() берет все элементы в массиве и помещает их вместе в строку, разделенные его первым аргументом.

1
ответ дан 8 December 2019 в 03:38
поделиться

Есть много возможностей. Думаю, это одно из самых простых решений:

$arr = array(0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd', 4 => 'e', 5 => 'f', 6 => 'g');

echo '[', current($arr);
while ($n = next($arr)) echo ',', $n;
echo ']';

Выводы:

[a,b,c,d,e,f,g]
1
ответ дан 8 December 2019 в 03:38
поделиться

Я стараюсь избегать использования циклов в подобных ситуациях. Вы должны использовать implode () для объединения списков с общим разделителем и использовать array_map () для обработки любой обработки этого массива перед объединением. Обратите внимание на следующие реализации, которые должны отражать универсальность этих функций. Карта массива может принимать строку (имя функции), представляющую либо встроенную функцию, либо функцию, определяемую пользователем (первые 3 примера). Вы можете передать ему функцию с помощью create_function () или передать лямбда / анонимную функцию в качестве первого параметра.

$a = array(1, 2, 3, 4, 5);

// Using the user defined function
function fn ($n) { return $n * $n; }
printf('[%s]', implode(', ', array_map('fn', $a)));
// Outputs: [1, 4, 9, 16, 25]

// Using built in htmlentities (passing additional parameter
printf('[%s]', implode(', ', array_map( 'intval' , $a)));
// Outputs: [1, 2, 3, 4, 5]

// Using built in htmlentities (passing additional parameter
$b = array('"php"', '"&<>');
printf('[%s]', implode(', ', array_map( 'htmlentities' , $b, array_fill(0 , count($b) , ENT_QUOTES) )));
// Outputs: [&quot;php&quot;, &quot;&amp;&lt;&gt;]

// Using create_function <PHP 5
printf('[%s]', implode(', ', array_map(create_function('$n', 'return $n + $n;'), $a)));
// Outputs: [2, 4, 6, 8, 10]

// Using a lambda function (PHP 5.3.0+)
printf('[%s]', implode(', ', array_map(function($n) { return $n; }, $a)));
// Outputs: [1, 2, 3, 4, 5]
1
ответ дан 8 December 2019 в 03:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: