2012-03-14 27 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>'); 
} 

Estoy usando un bucle foreach para crear una navegación para un plugin de WordPress en el que estoy trabajando, pero no quiero el '|' para que se muestre para el último elemento, el código anterior es lo que tengo hasta ahora, estaba pensando en utilizar una declaración if en la línea comentada, pero no estoy seguro de cuál sería el mejor enfoque, ¿alguna idea? ¡Gracias!PHP Foreach If Array Last

+0

Puede mover el segundo y tercer eco por encima del primero. Luego if (iteration == first_time) "do_not_echo_2nd, 3rd". – Neal

+0

Eche un vistazo a esta solución: http://stackoverflow.com/a/29474468/1478566 – vbarbarosh

Respuesta

64

El end() función es lo que necesita:

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

Gracias, esto funcionó perfectamente, aceptaré esto como la respuesta, pero tengo que esperar 3 minutos. xD –

+21

@KristianMatthews, casi esperas 2 años ahora por cierto. :) – Thasmo

+4

Pellizco menor, colocaría en caché el extremo ($ tabs2) en una var antes del ciclo foreach para que la función final no se ejecute todas las veces. – terraling

1

Me resulta más fácil verificar primero que en último lugar. Así que lo haría de esta manera en su lugar.

$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>"); 
} 

También he combinado los dos últimos echos juntos.

+0

Gracias por la ayuda, pero esto inmediatamente establece '$ first = true;' then '$ first = false;' esencialmente. –

+0

Hm, ¿no es sorprendente, no solo resuena en el descanso al comienzo de cada línea que no es primera? –

0

Algo como esto es posible:

$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

primero que tienes que averiguar cuál es la última clave de la matriz, y hacerlo al encontrar la longitud de la matriz, usando la función count().
Después vamos a crear un contador y agregar +1 en cada ciclo.
Si el contador y la última clave son iguales, entonces es la última clave.

 

    $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

¿Por qué no aparece primero el último elemento? Entonces no necesita verificar si el elemento actual es el último elemento en cada iteración.

La función array_pop (& $ array) devuelve el último elemento y lo elimina de la matriz.

<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

que haría de esta manera:

$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

final() es una buena función para utilizar

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

o puede hacerlo de forma manual para mayor comprensión

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