2011-02-09 7 views
8

Usando un ciclo for para regular, es posible comparar el índice actual con el último para decir si estoy en la última iteración del ciclo. ¿Hay algo similar cuando se usa foreach? Quiero decir algo como esto.en foreach, isLastItem() existe?

foreach($array as $item){ 
    //do stuff 
    //then check if we're in the last iteration of the loop 
    $last_iteration = islast(); //boolean true/false 
} 

Si no, ¿hay al menos una forma de conocer el índice actual de la iteración actual como $iteration = 5, por lo que se puede comparar manualmente a lo largo de la $array?

+0

no, no es – knittl

+0

Lamentablemente, no hay tal función, al menos no en PHP nativo. Me pregunto si es posible al consultar la posición actual del puntero dentro de la matriz. Aunque nunca he visto algo así, probablemente no. –

+0

Tal vez deberías explicar por qué querrías saber si el valor actual es el último valor. – Gumbo

Respuesta

1

No, necesita tener un contador y saber la cantidad de elementos en la lista. Puede usar end() para obtener el último elemento de una matriz y ver si coincide con el valor actual en su foreach.

+0

Buena solución, pero como señala @Dan Grossman, esto depende de que los valores sean únicos para que no haya confusión. – zmol

1

Si sabe que los valores de la matriz siempre serán únicos, puede comparar la actual $item con end($array) para saber si está en el último artículo. De lo contrario, no, necesitas un contador.

1

Puede obtener la clave y el valor en foreach() así:

foreach($array as $key=>$value) { ... }

Alternativamente, se puede hacer un count() de la matriz para que sepa cuántos elementos hay y tienen un contador incremental por lo que sabes cuando has llegado al último artículo.

21

El método de contador es probablemente el más fácil.

$i = count($array); 
foreach($array as $item){ 
    //do stuff 
    //then check if we're in the last iteration of the loop 
    $last_iteration = !(--$i); //boolean true/false 
} 
+0

+1 He votado Gumbo pero su solución parece hacer lo mismo y es mucho más simple – AntonioCS

1
end($array); 
$lastKey = key($array); 
foreach($array as $key => $value) { 
    if ($key === $lastKey) { 
     // do something endish 
    } 
} 
1

Éstos son algunos métodos para esto;

$items = ["Bhir", "Ekky", null, "Uych", "foo"=>"bar"]; 
$values = array_values($items); 

// Bhir, Ekky, Uych, bar 
foreach ($values as $i => $item) { 
    print("$item"); 
    $next = isset($values[$i + 1]); 
    if ($next) { 
     print(", "); 
    } 
} 

// Bhir, Ekky, , Uych, bar 
foreach ($values as $i => $item) { 
    print("$item"); 
    $next = array_key_exists($i + 1, $values); 
    if ($next) { 
     print(", "); 
    } 
} 

// Bhir, Ekky, , Uych, bar 
$i = count($values); 
foreach ($items as $item) { 
    print("$item"); 
    $next = !!(--$i); 
    if ($next) { 
     print(", "); 
    } 
} 

// Bhir, Ekky, , Uych, bar 
$items = new \CachingIterator(new \ArrayIterator($items)); 
foreach ($items as $item) { 
    print("$item"); 
    $next = $items->hasNext(); 
    if ($next) { 
     print(", "); 
    } 
} 
0

El método valid() indica si el objeto ArrayIterator tiene más elementos.

Ver:

$arr = array("Banana","Abacaxi","Abacate","Morango"); 

$iter = new ArrayIterator($arr); 

while($iter->valid()){ 

    echo $iter->key()." - ".$iter->current()."<br/>"; 

    $iter->next(); 

}