2012-03-14 10 views
19
foreach($tabs2 as $tab2 => $name){ 
    $class = ($tab2 == $current) ? ' current' : ''; 
    echo("<li class='posts'><a href='?page=pigg&tab=help&tab2=$tab2' class='$class'>$name"); 
    echo(' |'); // If array last then do not display 
    echo('</a></li>'); 
} 

Я использую цикл foreach для создания навигации для плагина WordPress, над которым я работаю, но я не хочу, чтобы '|' для отображения последнего элемента, код выше - это то, что у меня до сих пор, я думал об использовании инструкции if в комментариях, но не уверен, какой лучший подход был бы, какие-либо идеи? Благодаря!PHP Foreach If Array Last

+0

Вы можете перемещать второе и третье эхо выше первого. Тогда if (итерация == first_time) «do_not_echo_2nd, 3rd». – Neal

+0

Взгляните на это решение: http://stackoverflow.com/a/29474468/1478566 – vbarbarosh

ответ

64

end() функция, что вам нужно:

if(end($tabs2) !== $name){ 
    echo ' |'; // not the last element 
} 
+0

Спасибо, это сработало отлично, я буду принимать это как ответ, но я должен ждать 3 минуты. xD –

+21

@ KristianMatthews, вы почти ждали 2 года назад кстати. :) – Thasmo

+4

Незначительная настройка, я бы тайно закончил ($ tabs2) в var перед циклом foreach, чтобы конечная функция не запускалась каждый раз. – terraling

1

Мне легче проверить сначала, а не последним. Поэтому я бы сделал это так.

$first = true; 
foreach($tabs2 as $tab2 => $name){ 
    if ($first) { 
     $first = false; 
    } else { 
     echo(' | '); 
    } 
    $class = ($tab2 == $current) ? ' current' : ''; 
    echo("<li class='posts'><a href='?page=pigg&tab=help&tab2=$tab2' class='$class'>$name</a></li>"); 
} 

Я также объединил последние два echos вместе.

+0

Спасибо за помощь, но это сразу же устанавливает '$ first = true;' then '$ first = false;' по существу. –

+0

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

0

Нечто подобное можно:

$size = count($tabs2); 
$counter = 0; 
foreach($tabs2 as $tab2 => $name){ 
    $class = ($tab2 == $current) ? ' current' : ''; 
    echo("<li class='posts'><a href='?page=pigg&tab=help&tab2=$tab2' class='$class'>$name"); 
    if (++$counter < $size){ 
     echo(' |'); // If array last then do not display  
    } 
    echo('</a></li>'); 
} 
1

Первое, что вам нужно выяснить, что это последний ключ из массива, и делаю это, найдя длину массива, используя функцию count().
Послесловие мы собираемся создать счетчик и добавить +1 на каждый цикл.
Если счетчик и последний ключ равны, то это последний ключ.

 

    $last = count($array); 
    $counter = 1; 
    foreach ($array as $key => $val){ 
    if ($counter != $last){ 
     // all keys but the last one 
     // do something  
     $counter++; // add one to counter count 
     } 
     else { 
      // this is for the last key 
    }// end else 

}// end foreach 

0

Почему бы не пометить последний элемент первым? Поэтому вам не нужно проверять, является ли текущий элемент последним элементом каждой итерации.

Функция array_pop (& $ array) возвращает последний элемент и удаляет его из массива.

<div id="breadcrumb"> 
    <?php 
     $lastBreadcrumb = array_pop($breadcrumb); 
     foreach ($breadcrumb as $crumb){ ?> 
      <a href=""><?php echo $crumb; ?></a> 
     <?php } ?><span><?php echo $lastBreadcrumb?></span> 
</div> 
1

Я хотел бы сделать так:

$arrLi = array(); 
foreach($tabs2 as $tab2 => $name){ 
    $class = ($tab2 == $current) ? ' current' : ''; 
    $arrLi[] = "<li class='posts'><a href='?page=pigg&tab=help&tab2=$tab2' class='$class'>$name</a></li>"; 
} 
echo implode('|', $arrLi); 
1

конец() хорошая функция для использования

foreach($tabs2 as $tab2 => $name){ 
if(end($tabs2)== $name) 
echo "|"; 
} 

или вы можете сделать это вручную для большего понимания

$copyofarry = $tabs2; 
    $last = array_pop($copyofarry); 
    foreach($tabs2 as $tab2 => $name){ 
     if($last == $name) 
     echo "|"; 
    }