D'accord,
Je sais tout sur array_pop()
, mais cela supprime le dernier élément. Quel est le meilleur moyen d'obtenir le dernier élément d'un tableau sans le supprimer?
EDIT: Voici un bonus:
$array = array('a' => 'a', 'b' => 'b', 'c' => 'c');
ou même
$array = array('a', 'b', 'c', 'd');
unset($array[2]);
echo $array[sizeof($array) - 1]; // Output: PHP Notice: Undefined offset: 2 in - on line 4
Court et doux.
Je suis venu avec une solution pour supprimer le message d'erreur et préserver la forme one-liner et la performance efficace:
$lastEl = array_values(array_slice($array, -1))[0];
- solution précédente
$lastEl = array_pop((array_slice($array, -1)));
Remarque: Les parenthèses supplémentaires sont nécessaires pour éviter un PHP Strict standards: Only variables should be passed by reference
.
Essayer
$myLastElement = end($yourArray);
Pour le réinitialiser (merci @hopeseekr):
reset($yourArray);
Lien vers manuel
@ David Murdoch a ajouté: $myLastElement = end(array_values($yourArray));// and now you don't need to call reset().
Sur E_STRICT, cela produit l'avertissement
Strict Standards: Only variables should be passed by reference
Merci o_O Tync et à tous!
Quel est le problème avec array_slice($array, -1)
? (Voir Manuel: http://us1.php.net/array_slice )
array_slice()
renvoie un tableau. Probablement pas ce que vous cherchez. Vous voulez l'élément.
Une façon d'éviter les erreurs de référence (par exemple, "end (array_values ($ foo))") consiste à utiliser call_user_func ou call_user_func_array:
// PHP Fatal error: Only variables can be passed by reference
// No output (500 server error)
var_dump(end(array(1, 2, 3)));
// No errors, but modifies the array's internal pointer
// Outputs "int(3)"
var_dump(call_user_func('end', array(1, 2, 3)));
// PHP Strict standards: Only variables should be passed by reference
// Outputs "int(3)"
var_dump(end(array_values(array(1, 2, 3))));
// No errors, doesn't change the array
// Outputs "int(3)"
var_dump(call_user_func('end', array_values(array(1, 2, 3))));
non testé: ne fonctionnerait-il pas?
<?php
$last_element=end(array_values($array));
?>
Puisque le tableau retourné par array_values est éphémère, personne ne se soucie de la réinitialisation de son pointeur.
et si vous avez besoin de la clé qui va avec, je suppose que vous feriez:
<?php
$last_key=end(array_keys($array));
?>
Si vous ne vous souciez pas de modifier le pointeur interne (prend en charge les tableaux indexés et associatifs):
// false if empty array
$last = end($array);
// null if empty array
$last = !empty($array) ? end($array) : null;
Si vous voulez une fonction utilitaire qui ne modifie pas le pointeur interne (car le tableau est passé par valeur et que la fonction opère sur une copie de celui-ci):
function array_last($array) {
if (empty($array)) {
return null;
}
return end($value);
}
Notez que PHP produit des copies "à la volée", c’est-à-dire uniquement lorsque cela est réellement nécessaire. end()
modifie lui-même le tableau, une copie du tableau est donc générée en interne.
Ainsi, l’alternative suivante est réellement plus rapide car en interne, il ne copie pas le tableau, il crée simplement une tranche:
function array_last($array) {
if (empty($array)) {
return null;
}
foreach (array_slice($array, -1) as $value) {
return $value;
}
}
Ce "foreach/return" est un Tweak permettant d’obtenir efficacement le premier élément (et ici celui qui est unique).
Enfin, l’alternative la plus rapide, mais uniquement pour les tableaux indexés:
$last = !empty($array) ? $array[count($array)-1] : null;
Pour mémoire, voici une autre de mes réponses , pour le premier élément du tableau.
J'ai souvent besoin de cela pour gérer les piles, et je me trouve toujours déconcerté par le fait qu'aucune fonction native ne le fait sans manipuler le tableau ou son pointeur interne sous une forme quelconque.
Donc, je transporte généralement une fonction util qui est également sûre à utiliser sur des tableaux associatifs.
function array_last($array) {
if (count($array) < 1)
return null;
$keys = array_keys($array);
return $array[$keys[sizeof($keys) - 1]];
}
end () fournira le dernier élément d'un tableau
$array = array('a' => 'a', 'b' => 'b', 'c' => 'c');
echo end($array); //output: c
$array1 = array('a', 'b', 'c', 'd');
echo end($array1); //output: d
Pour obtenir le dernier élément d'un tableau, utilisez:
$lastElement = array_slice($array, -1)[0];
Référence
J'ai répété 1 000 fois, en récupérant le dernier élément de tableaux de taille petite et grande contenant respectivement 100 et 50 000 éléments.
Method: $array[count($array)-1];
Small array (s): 0.000319957733154
Large array (s): 0.000526905059814
Note: Fastest! count() must access an internal length property.
Note: This method only works if the array is naturally-keyed (0, 1, 2, ...).
Method: array_slice($array, -1)[0];
Small array (s): 0.00145292282104
Large array (s): 0.499367952347
Method: array_pop((array_slice($array, -1, 1)));
Small array (s): 0.00162816047668
Large array (s): 0.513121843338
Method: end($array);
Small array (s): 0.0028350353241
Large array (s): 4.81077480316
Note: Slowest...
J'ai utilisé PHP version 5.5.32.
Pour moi:
$last = $array[count($array) - 1];
Avec les associatifs:
$last =array_values($array)[count($array - 1)]
A partir de PHP version 7.3, les fonctions array_key_first
et array_key_last
ont été introduites.
Comme les tableaux de PHP ne sont pas des types de tableaux stricts, c’est-à-dire des ensembles de taille fixe commençant par l’index 0, mais un tableau associatif étendu de manière dynamique, la gestion des positions avec des clés inconnues est difficile et les solutions de contournement ne fonctionnent pas très bien. En revanche, les tableaux réels seraient très rapidement adressés en interne via l'arithmétique des pointeurs et le dernier index est déjà connu au moment de la compilation par déclaration.
Au moins le problème avec la première et la dernière position est résolu par les fonctions intégrées maintenant depuis la version 7.3. Cela fonctionne même sans aucun avertissement sur littéraux de tableau hors de la boîte:
$first = array_key_first( [1, 2, 'A'=>65, 'B'=>66, 3, 4 ] );
$last = array_key_last ( [1, 2, 'A'=>65, 'B'=>66, 3, 4 ] );
Evidemment la dernière valeur est:
$array[array_key_last($array)];
Que diriez-vous:
current(array_slice($array, -1))
$array == []
(retourne false
)Une autre solution:
$array = array('a' => 'a', 'b' => 'b', 'c' => 'c');
$lastItem = $array[(array_keys($array)[(count($array)-1)])];
echo $lastItem;
Utilisez la fonction end ().
$array = [1,2,3,4,5];
$last = end($array); // 5
Remarque: Pour (PHP 7> = 7.3.0) nous pouvons utiliser array_key_last - Obtient la dernière clé d'un tableau.
array_key_last ( array $array ) : mixed
Pour ce faire et éviter E_STRICT et ne pas déranger le pointeur interne du tableau, vous pouvez utiliser:
function lelement($array) {return end($array);}
$last_element = lelement($array);
lelement ne fonctionne qu'avec une copie et n'affecte donc pas le pointeur du tableau.
Une autre solution possible ...
$last_element = array_reverse( $array )[0];
$lastValue = end(array_values($array))
Aucune modification n'est apportée aux pointeurs $ array. Cela évite la
reset($array)
ce qui pourrait ne pas être désiré dans certaines conditions.
De nos jours, je préférerais toujours avoir cette aide, comme suggéré dans un php.net/end answer .
<?php
function endc($array) {
return end($array);
}
$items = array('one','two','three');
$lastItem = endc($items); // three
$current = current($items); // one
?>
Cela gardera toujours le pointeur tel quel et nous n'aurons jamais à nous soucier de la parenthèse, des normes strictes ou autre.
Pour obtenir la dernière valeur de Array:
array_slice($arr,-1,1) ;
Pour supprimer la dernière valeur du tableau:
array_slice($arr,0,count($arr)-1) ;
Je pense que c'est une légère amélioration par rapport à toutes les réponses existantes:
$lastElement = count($array) > 0 ? array_values(array_slice($array, -1))[0] : null;
end()
ou que les solutions utilisant array_keys()
, en particulier avec les baies de grande tailleSimplement: $last_element = end((array_values($array)))
Ne réinitialise pas le tableau et ne donne pas les avertissements STRICT.
PS. Comme la réponse la plus votée n'a toujours pas la double parenthèse, j'ai soumis cette réponse.
Les meilleures réponses sont bonnes, mais comme mentionné par @ paul-van-leeuwen et @ quasimodos-clone, PHP 7.3 introduira deux nouvelles fonctions pour résoudre ce problème directement - array_key_first () et array_key_last () .
Vous pouvez commencer à utiliser cette syntaxe aujourd'hui avec les fonctions polyfill (ou shim) suivantes .
// Polyfill for array_key_last() available from PHP 7.3
if (!function_exists('array_key_last')) {
function array_key_last($array) {
return array_slice(array_keys($array),-1)[0];
}
}
// Polyfill for array_key_first() available from PHP 7.3
if (!function_exists('array_key_first')) {
function array_key_first($array) {
return array_slice(array_keys($array),0)[0];
}
}
// Usage examples:
$first_element_key = array_key_first($array);
$first_element_value = $array[array_key_first($array)];
$last_element_key = array_key_last($array);
$last_element_value = $array[array_key_last($array)];
Caveat: Cela nécessite PHP 5.4 ou plus.
Vous obtiendrez facilement le dernier élément d'un tableau en utilisant la logique ci-dessous
$array = array('a', 'b', 'c', 'd');
echo ($array[count($array)-1]);
Non seulement dernier élément, mais vous pouvez également obtenir l'avant dernier, le troisième dernier et ainsi de suite en utilisant la logique ci-dessous.
pour l'avant dernier élément, il suffit de passer le numéro 2 dans la déclaration ci-dessus, par exemple:
echo ($ array [count ($ array) -2]);
À partir de PHP 7.3, ceci est disponible
$ lastEl = $ myArray [array_key_last ($ myArray [))
$file_name_dm = $_FILES["video"]["name"];
$ext_thumb = extension($file_name_dm);
echo extension($file_name_dm);
function extension($str){
$str=implode("",explode("\\",$str));
$str=explode(".",$str);
$str=strtolower(end($str));
return $str;
}