web-dev-qa-db-fra.com

Quel est le meilleur moyen d'obtenir le dernier élément d'un tableau sans le supprimer?

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
348
Theodore R. Smith

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.

171
rolacja

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!

454
Iznogood

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.

34
Stoutie

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))));
19
Warbo

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));
?>
10
TecBrat

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.

9
Gras Double

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]];
}
8
thrau

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
6
Ajith

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.

5
Westy92

Pour moi:

$last = $array[count($array) - 1];

Avec les associatifs:

$last =array_values($array)[count($array - 1)]
3
Mirko Pagliai

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)];
2
Quasimodo's clone

Que diriez-vous:

current(array_slice($array, -1))
  • fonctionne pour les tableaux associatifs
  • fonctionne lorsque $array == [] (retourne false)
  • n'affecte pas le tableau d'origine
2
Bouke Versteegh

Une autre solution:

$array = array('a' => 'a', 'b' => 'b', 'c' => 'c');
$lastItem = $array[(array_keys($array)[(count($array)-1)])];
echo $lastItem;
2
Giuseppe Gallo

Utilisez la fonction end ().

$array = [1,2,3,4,5];
$last = end($array); // 5
2
Brian Berneker

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

Réf.: http://php.net/manual/en/function.array-key-last.php

2
lokender singh

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.

2
Damiene Stewart

Une autre solution possible ...

$last_element = array_reverse( $array )[0];
2
Charles Garrison
$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.

1
Vihaan Verma

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.

1
giovannipds

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) ;
1
Rishabh

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;
  • Fonctionne mieux que end() ou que les solutions utilisant array_keys(), en particulier avec les baies de grande taille
  • Ne modifiera pas le pointeur interne du tableau
  • Ne tentera pas d'accéder à un décalage non défini pour les tableaux vides
  • Fonctionnera comme prévu pour les tableaux vides, les tableaux indexés, les tableaux mélangés et les tableaux associatifs
1
Adelmar

Simplement: $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.

1
Daan

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.

1
Mark Thomson

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]);

0
Amzad Khan

À partir de PHP 7.3, ceci est disponible

$ lastEl = $ myArray [array_key_last ($ myArray [))

0
Tagarikdi Djakouba
$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;
}
0
Hussy Borad