web-dev-qa-db-fra.com

PHP - Comment obtenir l'élément avant le dernier élément d'un tableau?

Comment puis-je obtenir l'élément avant le dernier élément d'un tableau en PHP 5?

46
Manny Calavera
$array[count($array)-2]

Il doit s'agir d'un tableau indexé numériquement (à partir de zéro). Vous devez avoir au moins 2 éléments pour que cela fonctionne. (évidemment)

69
Notinlist

Cela fonctionnera même sur ce tableau:

$array[0] = "hello";
$array[5] = "how";
$array[9] = "are";

end($array);
echo prev($array); // will print "how"

Les autres solutions utilisant count () supposent que les index de votre tableau fonctionnent dans l'ordre; en utilisant end et prev pour déplacer le pointeur du tableau, vous obtenez les valeurs réelles. Essayez d'utiliser la méthode count () sur le tableau ci-dessus et cela échouera.

118
Erik

array_slice prend un décalage négatif comme deuxième argument. Cela vous donnera un tableau d'éléments unique contenant l'avant-dernier élément:

$arr = array(1,2,3,4,5,6);
array_slice($arr, -2, 1);

Si vous voulez juste la valeur unique seule, vous avez plusieurs options. Si cela ne vous dérange pas d'utiliser une variable intermédiaire, vous pouvez simplement obtenir la première valeur avec [0] ou appeler array_pop ou array_shift, ils ont tous deux besoin d'une variable transmise par référence ou vous obtiendrez des avertissements en mode strict.

Ou vous pouvez simplement utiliser array_sum ou array_product, ce qui est un peu hacky mais fonctionne bien pour les tableaux à élément unique.

16
James Wheare

Quant à moi, assez petite solution

end($array);
echo prev($array);
16
DevAnimal

Une méthode qui fonctionnera à la fois pour le tableau associatif et le tableau numérique consiste à utiliser array_pop() pour faire disparaître l'élément à la fin du tableau.

$last = array_pop($array);
$second_last = array_pop($array);

// put back the last
array_Push($array, $last);
6
Yada

Tous les tableaux ont un "pointeur de tableau interne" qui pointe vers l'élément de tableau actuel, PHP a plusieurs fonctions qui permettent pour naviguer dans le tableau et afficher la clé et la valeur des éléments actuels.

  • end() - Définit le pointeur interne d'un tableau sur son dernier élément
  • reset() - Définit le pointeur interne d'un tableau sur son premier élément
  • prev() - Rembobine le pointeur du tableau interne
  • next() - Avance le pointeur de tableau interne d'un tableau
  • current() - Retourne l'élément courant dans un tableau
  • key() - Récupère une clé dans un tableau
  • each() - Retourne la paire clé/valeur actuelle d'un tableau et avance le curseur du tableau

Ces fonctions fonctionnent que le tableau soit vide, séquentiel ou associatif et comme un tableau n'a pas été spécifié dans l'exemple, j'ai supposé que cela devait fonctionner avec n'importe quel tableau.

$array = array(
    'before_last' => false,
    'last' => false,
);

end($array); /* 
- set pointer to last element -> $array['last']
- return new current element value if it exists, -> false
- else return FALSE 
*/

prev($array); /* 
- set pointer one place before current pointer -> $array['before_last']
- return new current element value if it exists, -> false
- else return FALSE 
*/

if(!is_null(key($array)){ /* 
- return current element key if it exists -> "before_last"
- else return NULL
*/
    $before_last_element_value = current($array); /* 
    - return current element value if it exists, -> false
    - else return FALSE 
    */
}

Comme vous pouvez voir le résultat attendu (false) et le résultat pour un élément inexistant est le même (FALSE) donc vous ne pouvez pas vérifier si un élément existe en utilisant la valeur d'élément retournée, une clé d'élément est différent.

La clé peut être soit entier ou chaîne . La valeur peut être de n'importe quel type . source

key() renvoie la valeur de la clé courante si l'élément existe sinon il renverra NULL. Une clé valide ne peut jamais être NULL, donc si null est retourné, nous pouvons déterminer que l'élément n'existe pas.

4
TarranJones
// Indexed based array
$test = array('a','b','c','d','e');
$count = count($test);
print $test[$count-2];

// Associative Array
$months = array(
         'jan'=>'January', 
         'feb' => 'february', 
         'mar' => 'March', 
         'apr' => 'April'
    );

$keys = array_keys($months);
$count = count($keys);
print $keys[$count-2];
2
Darshana