Как вывести последний элемент массива php
Перейти к содержимому

Как вывести последний элемент массива php

  • автор:

Указать последний элемент массива

Я хочу выбрать последний элемент массива, но получаю ошибку undefined offset: 1. Если укажу ключ руками, то норм, а подставлять $last не получается У меня есть скрипт по которому я получаю массив с данными из crm. И мне нужно выбрать последний элемент. Чтобы получить его id.

// Пример массива $clients = [ 'users' => [ '0' => [ 'id' => '1212', 'phone' => '22204490122', 'message' => 'dddd', ], '1' => [ 'id' => '4111', 'phone' => '22204490122', 'message' => 'aaaa', ], ] ]; $last = count($clients) - 1; $clients['users'][$last]['id'];

Как получить последний элемент массива в PHP

Имеется много способов извлечь последний элемент массива в PHP скрипте. Они различаются своим воздействием на массив (могут удалять извлечённый элемент, либо сдвигать указатель), а также своей производительностью.

Вариант 1

Начиная с PHP 7.3 наконец-то добавлена специальная функция, которая получает последний ключ массива, это функция array_key_last.

Обратите внимание, что извлекается не последний элемент массива, а именно последний ключ, поэтому для получения самого последнего члена массива эту функцию нужно использовать следующим образом:

$x = $array[array_key_last($array)];

Бенчмарки производительности показывают, что это самый быстрый вариант, поэтому рекомендуется использовать именно его.

Поскольку PHP 7.3 на момент написания является совсем недавним стабильным релизом, то эта версия доступна ещё не на всех серверах. Для достижения совместимости, рекомендуется использовать следующий код:

if (! function_exists("array_key_last")) < function array_key_last($array) < if (!is_array($array) || empty($array)) < return NULL; >return array_keys($array)[count($array)-1]; > >

Этот код проверяет, доступна ли функция array_key_last. Если эта функция недоступна, то создаётся пользовательская функция с таким же именем, которая выполняет это же самое действие. Результатом этого будет то, что на PHP версии 7.3 и более поздних будет использоваться оригинальная функция array_key_last, а на более старых версиях будет задействована пользовательская функция array_key_last.

Рассмотрим ещё варианты, которые подойдут для более старых версий PHP.

Некоторые из рассмотренных вариантов могут показаться излишне усложнёнными, но это сделано для того, чтобы убрать воздействие на массив. К примеру, нужное действие (получение последнего элемента массива) может выполнять функция array_pop, но она не используется сама по себе (хотя применяется в некоторых рассмотренных конструкциях), поскольку в результате её действия удаляется извлекаемый элемент.

Вариант 2

$x = array_values(array_slice($array, -1))[0];

Вариант 3

$x = array_slice($array, -1)[0];

array_key_last

Получить последний ключ заданного массива array , не затрагивая внутренний указатель массива.

Список параметров

Возвращаемые значения

Возвращает последний ключ массива array , если он не пустой; null в противном случае.

Смотрите также

  • array_key_first() — Получает первый ключ массива
  • end() — Устанавливает внутренний указатель массива на последний элемент

User Contributed Notes 12 notes

4 years ago

For those who loves tested candies;

function array_key_last (array $array ) // 100000 iters: ~0.068 secs
return key ( array_slice ( $array , — 1 ));
// 100000 iters: ~0.070 secs
return key ( array_reverse ( $array ));
// 100000 iters: ~0.088 secs
return array_keys ( $array )[ count ( $array ) — 1 ] ?? null ;
>
?>

5 years ago

if (! function_exists(«array_key_last»)) function array_key_last($array) if (!is_array($array) || empty($array)) return NULL;
>

4 years ago

Try to beat this polyfill in terms of performance!

if( ! function_exists ( ‘array_key_last’ ) ) function array_key_last (array $array ) if( !empty( $array ) ) return key ( array_slice ( $array , — 1 , 1 , true ));
>
>

// Bonus
if (! function_exists ( ‘array_key_first’ )) function array_key_first (array $arr ) foreach( $arr as $key => $unused ) return $key ;
>
>
?>

3 years ago

did return the first key of my array only:
«array_keys($array)[count($array) — 1] ?? null» works

I hope the example is fine for everyone else.

My array is:
[
new NameExpression(‘d’, 0),
new NameExpression(‘f’, 0),
new NameExpression(‘g’, 0),
]

4 years ago

// if : php ver < 7
// array_key_last

$arr = array(‘1’=>’bear1′,’2’=>array(’22’=>’bear22′),’3’=>’bear3’);
echo end(array_keys($arr));

4 years ago

// PHP >= 7
function _array_key_last (array $array ) return (!empty( $array )) ? array_keys ( $array )[ count ( $array )- 1 ] : null ;
>
var_dump ( _array_key_last ([ ‘PHP’ , ‘Javascript’ , ‘Python’ ])); // 2
?>

5 years ago

Will work for any type of array

if ( ! function_exists ( ‘array_key_last’ ) ) /**
* Polyfill for array_key_last() function added in PHP 7.3.
*
* Get the last key of the given array without affecting
* the internal array pointer.
*
* @param array $array An array
*
* @return mixed The last key of array if the array is not empty; NULL otherwise.
*/
function array_key_last ( $array ) $key = NULL ;

if ( is_array ( $array ) )

end ( $array );
$key = key ( $array );
>

2 years ago

echo (array_key_last($a)); // output: «0», not «1»

3 years ago

Here come my benchmark, and

return key(array_slice($array, -1));

is the my best answer for a polyfill.

function array_key_last_1 (array $array ) // assert(!empty($array));
return key ( array_slice ( $array , — 1 ));
>

function array_key_last_2 (array $array ) return key ( array_slice ( $array , — 1 , 1 , true ));
>

function array_key_last_3 (array $array ) return key ( array_reverse ( $array ));
>

function array_key_last_4 (array $array ) return array_keys ( $array )[ count ( $array ) — 1 ] ?? null ;
>

function array_key_last_5 (array $array ) return array_keys ( $array )[ count ( $array ) — 1 ] ?? null ;
>

function array_key_last_6 (array $array ) $copy = array_keys ( $array );
return end ( $copy );
>

$result = array();
$array = range ( 0 , 1000000 );

for( $i = 1 ; $i < 7 ; $i ++) $callback = 'array_key_last_' . $i ;
$before = microtime ( true );
call_user_func_array ( $callback , array( $array ));
$after = microtime ( true );
$time = ( $after — $before );
$result [ $callback ] = $time ;
>

asort ( $result );
foreach ( $result as $key => $value ) echo ‘[‘ . $key . ‘]’ . $value . » sec» . PHP_EOL ;
>

3 years ago

Now that we have this function, where we once used.
$idxLast = count ( $arr ) — 1 ;
?>
we can now optimize code speed by using.
$idxLast = ( array_key_last ( $arr ) ?? 0 );
?>
Use-cases include lots of looping and control-structures.
If you do not know ahead of time that the array is numerically indexed, and that it could possibly be associative. safer/faster to stick with count().

4 years ago

This polyfill works for PHP 5.6+.
It is a slight modification of «wes at nospam dot example dot org»‘s example:

if( ! function_exists ( ‘array_key_first’ ) )

function array_key_first (array $array )

if( ! function_exists ( ‘array_key_last’ ) )

function array_key_last (array $array )

// the last 2 args to array_slice are crucial
return array_key_first ( array_slice ( $array , — 1 , null , true ));
>
>

4 years ago

Correct polyfill (one that doesn’t make copies of arrays, and that doesn’t make use of the IAP) is:

if(! function_exists ( ‘array_key_first’ )) function array_key_first (array $array ) if( $array === []) return NULL ;
>
foreach( $array as $key => $_ ) return $key ;
>
>

if(! function_exists ( ‘array_key_last’ )) function array_key_last (array $array ) if( $array === []) return NULL ;
>
return array_key_first ( array_slice ( $array , — 1 ));
>
>

  • Функции для работы с массивами
    • array_​change_​key_​case
    • array_​chunk
    • array_​column
    • array_​combine
    • array_​count_​values
    • array_​diff_​assoc
    • array_​diff_​key
    • array_​diff_​uassoc
    • array_​diff_​ukey
    • array_​diff
    • array_​fill_​keys
    • array_​fill
    • array_​filter
    • array_​flip
    • array_​intersect_​assoc
    • array_​intersect_​key
    • array_​intersect_​uassoc
    • array_​intersect_​ukey
    • array_​intersect
    • array_​is_​list
    • array_​key_​exists
    • array_​key_​first
    • array_​key_​last
    • array_​keys
    • array_​map
    • array_​merge_​recursive
    • array_​merge
    • array_​multisort
    • array_​pad
    • array_​pop
    • array_​product
    • array_​push
    • array_​rand
    • array_​reduce
    • array_​replace_​recursive
    • array_​replace
    • array_​reverse
    • array_​search
    • array_​shift
    • array_​slice
    • array_​splice
    • array_​sum
    • array_​udiff_​assoc
    • array_​udiff_​uassoc
    • array_​udiff
    • array_​uintersect_​assoc
    • array_​uintersect_​uassoc
    • array_​uintersect
    • array_​unique
    • array_​unshift
    • array_​values
    • array_​walk_​recursive
    • array_​walk
    • array
    • arsort
    • asort
    • compact
    • count
    • current
    • end
    • extract
    • in_​array
    • key_​exists
    • key
    • krsort
    • ksort
    • list
    • natcasesort
    • natsort
    • next
    • pos
    • prev
    • range
    • reset
    • rsort
    • shuffle
    • sizeof
    • sort
    • uasort
    • uksort
    • usort
    • each
    • Copyright © 2001-2024 The PHP Group
    • My PHP.net
    • Contact
    • Other PHP.net sites
    • Privacy policy

    prev

    Сдвигает внутренний указатель массива на одну позицию назад.

    Функция prev() ведёт себя так же, как функция next() , за исключением того, что она отматывает внутренний указатель массива на одну позицию, а не продвигает его.

    Список параметров

    Возвращаемые значения

    Возвращает значение предыдущего элемента массива, относительно позиции внутреннего указателя, или false , если больше нет элементов.

    Внимание

    Функция возвращает как логическое значение false , так и нелогическое значение, которое приводится к false . Прочитайте раздел «Логический тип», чтобы получить дополнительную информацию. Используйте оператор === для проверки значения, которое возвращает функция.

    Список изменений

    Версия Описание
    8.1.0 Вызов функции на объекте ( object ) объявлен устаревшим. Объект ( object ) либо сначала преобразовывают в массив ( array ) функцией get_mangled_object_vars() , либо пользуются методами класса, в котором реализовали интерфейс Iterator , например, ArrayIterator .
    7.4.0 Экземпляры классов библиотеки SPL теперь обрабатываются как пустые объекты, у которых нет свойств, вместо вызова метода интерфейса Iterator с тем же именем, что и у этой функция.

    Примеры

    Пример #1 Пример использования функции prev() и дружественных функций

    $transport = array( ‘foot’ , ‘bike’ , ‘car’ , ‘plane’ );
    $mode = current ( $transport ); // $mode = ‘foot’;
    $mode = next ( $transport ); // $mode = ‘bike’;
    $mode = next ( $transport ); // $mode = ‘car’;
    $mode = prev ( $transport ); // $mode = ‘bike’;
    $mode = end ( $transport ); // $mode = ‘plane’;

    Примечания

    Замечание: Начало массива неотличимо от элемента с логическим ( bool ) значением false . Чтобы отличить, нужно проверить, что возвращаемый функцией key() ключ предыдущего элемента, как его определяет функция prev() , не равен значению null .

    Смотрите также

    • current() — Возвращает текущий элемент массива
    • end() — Устанавливает внутренний указатель массива на последний элемент
    • next() — Сдвигает внутренний указатель массива на одну позицию вперёд
    • reset() — Устанавливает внутренний указатель массива на первый элемент
    • each() — Возвращает текущую пару ключа и значения массива и сдвигает указатель на одну позицию вперёд

    User Contributed Notes 4 notes

    9 years ago

    This function searches for the closest element in an array by key value, and returns the key/value pair, or false if not found.

    function nearest ( $array , $value , $exact = false ) // Initialize Variables
    $next = false ;
    $prev = false ;
    $return = false ;

    // Loop through array until match is found, then set $prev and $next to the respective keys if exist
    while ( ! is_null ( $key = key ( $array )) ) $val = current ( $array );
    if( $key == $value ) prev ( $array ); // Get entry before this one
    $prev = key ( $array );
    next ( $array ); // Skip current entry as this was what we were looking for nearest to
    next ( $array ); // Get entry after this one
    $next = key ( $array );
    break;
    >
    next ( $array );
    >

    if( $prev && $next ) if(( $long — $prev ) > ( $next — $long )) // Previous is closer
    $return = Array( $prev => $array [ $prev ]);
    > else // Next is closer
    $return = Array( $next => $array [ $next ]);
    >
    > elseif ( $prev || $next ) if( $prev ) // Only Previous exists
    $return = Array( $prev => $array [ $prev ]);
    > elseif ( $next ) // Only Next exists
    $return = Array( $next => $array [ $next ]);
    >
    >
    >

    // Return resulting Array(). $return is false if nothing matches the closest conditions, or if exact is specified and key does not exist.
    return $return ;
    >
    ?>

    Example usage (to lookup the closest color in an array)
    $mycolors = Array(
    5001046 => ‘Abbey’ ,
    1774596 => ‘Acadia’ ,
    8171681 => ‘Acapulco’ ,
    6970651 => ‘Acorn’ ,
    13238245 => ‘Aero Blue’ ,
    7423635 => ‘Affair’ ,
    8803850 => ‘Afghan Tan’ ,
    13943976 => ‘Akaroa’ ,
    16777215 => ‘Alabaster’ ,
    16116179 => ‘Albescent White’ ,
    10176259 => ‘Alert Tan’ ,
    30371 => ‘Allports’
    );

    // Color to search for in Hex
    $color = ‘C0C0C0’ ;

    // Convert Hex to Long to compare with array() keys
    $colorlong = base_convert ( $color , 16 , 10 );

    // Check for an exact match
    $result = nearest ( $mycolors , $colorlong , true );
    if( $result ) echo «An exact match was found for #» . $color . » which is called ‘» . $result [ key ( $result )] . «‘» ;
    > else echo «No exact match was found» ;
    >

    if(! $result ) // Check for closest match
    $result = nearest ( $mycolors , $colorlong , true );
    if( $result ) // Match found
    echo «The closest match for #» . $color . » is #» . base_convert ( key ( $result ), 10 , 16 ) . » which is called ‘» . $result [ key ( $result )] . «‘» ;
    > else // No match found
    echo «No match was found for #» . $color ;
    >
    >
    ?>

    14 years ago

    Here’s a slight revision to xmlich02’s backwards iteration example. The problem with his/her example is that it will halt if any of the array elements are boolean false, while this version will not.

    end ( $ar );
    while ( ! is_null ( $key = key ( $ar )) ) $val = current ( $ar );
    echo » < $key >=> < $val >\n» ;
    prev ( $ar );
    >

    4 years ago

    Function to get element in array, that goes previous your key or false if it not exeists or key doesn’t isset in array.

    function previousElement (array $array , $currentKey )
    if (!isset( $array [ $currentKey ])) return false ;
    >
    end ( $array );
    do $key = array_search ( current ( $array ), $array );
    $previousElement = prev ( $array );
    >
    while ( $key != $currentKey );

    9 years ago

    Some corrections to the previous function.
    — When prev() and next() distance is now calculated properly returning the ‘closer’ one.
    — When exact is false, and an item exists with the key searched for, it now returns that entry instead of next/prev closest
    — At ends of the array, sometimes when moving past using next() or prev(), it caused results to die. This was corrected.
    — Added field to result stating whether the match was ‘exact’ (‘exact’=>true), or nearest (‘exact’=>false)

    function nearest ( $array , $value , $exact = false ) // Initialize Variables
    $next = false ;
    $prev = false ;
    $return = false ;

    $arr_begin = false ;
    $arr_end = false ;

    // Sort array so injected record is near relative numerics
    ksort ( $array ); // Sort array on key

    // Set start and end keys
    $arr_begin = key ( $array );
    end ( $array );
    $arr_end = key ( $array );
    reset ( $array );

    // Loop through array until match is found, then set $prev and $next to the respective keys if exist
    while ( ! is_null ( $key = key ( $array )) ) $val = current ( $array );
    if( $key == $value ) if( $value <> $arr_begin ) prev ( $array ); // Get entry before this one
    $prev = key ( $array );
    >

    next ( $array ); // Skip current entry as this was what we were looking for nearest to

    if( $value <> $arr_end ) next ( $array ); // Get entry after this one
    $next = key ( $array );
    >
    break;
    >
    next ( $array );
    >

    if( $prev && $next ) if(( $value — $prev ) < ( $next - $value )) // Previous is closer
    $return = Array( $prev => $array [ $prev ]);
    > else // Next is closer
    $return = Array( $next => $array [ $next ]);
    >
    > elseif ( $prev || $next ) if( $prev ) // Only Previous exists
    $return = Array( $prev => $array [ $prev ]);
    > elseif ( $next ) // Only Next exists
    $return = Array( $next => $array [ $next ]);
    >
    >
    >

    // Return resulting Array(). $return is false if nothing matches the closest conditions, or if exact is specified and key does not exist.
    if( $return ) return $return +Array( ‘exact’ => $exact_match );
    > else return false ;
    >
    >
    ?>

    Just to clarify, this function will return either an Array() containing the $key=>$value pair of the result and ‘exact’=>(bool) whether the match was exact or not.

    To access the $key=>$value pair, can be done as follows :

    $result = nearest ( . ); // Just here for clarification of the position for the code that follows.

    if( $result ) // Output the Key
    echo key ( $result );

    // Output the Value
    echo $result ( key ( $result ) );

    // Output if exact match
    if( $result [ ‘exact’ ]) echo ‘This was an EXACT match’ ;
    > else echo ‘This result was found with fuzzy logic’ ;
    >

    echo ‘No result found’ ;

    • Функции для работы с массивами
      • array_​change_​key_​case
      • array_​chunk
      • array_​column
      • array_​combine
      • array_​count_​values
      • array_​diff_​assoc
      • array_​diff_​key
      • array_​diff_​uassoc
      • array_​diff_​ukey
      • array_​diff
      • array_​fill_​keys
      • array_​fill
      • array_​filter
      • array_​flip
      • array_​intersect_​assoc
      • array_​intersect_​key
      • array_​intersect_​uassoc
      • array_​intersect_​ukey
      • array_​intersect
      • array_​is_​list
      • array_​key_​exists
      • array_​key_​first
      • array_​key_​last
      • array_​keys
      • array_​map
      • array_​merge_​recursive
      • array_​merge
      • array_​multisort
      • array_​pad
      • array_​pop
      • array_​product
      • array_​push
      • array_​rand
      • array_​reduce
      • array_​replace_​recursive
      • array_​replace
      • array_​reverse
      • array_​search
      • array_​shift
      • array_​slice
      • array_​splice
      • array_​sum
      • array_​udiff_​assoc
      • array_​udiff_​uassoc
      • array_​udiff
      • array_​uintersect_​assoc
      • array_​uintersect_​uassoc
      • array_​uintersect
      • array_​unique
      • array_​unshift
      • array_​values
      • array_​walk_​recursive
      • array_​walk
      • array
      • arsort
      • asort
      • compact
      • count
      • current
      • end
      • extract
      • in_​array
      • key_​exists
      • key
      • krsort
      • ksort
      • list
      • natcasesort
      • natsort
      • next
      • pos
      • prev
      • range
      • reset
      • rsort
      • shuffle
      • sizeof
      • sort
      • uasort
      • uksort
      • usort
      • each
      • Copyright © 2001-2024 The PHP Group
      • My PHP.net
      • Contact
      • Other PHP.net sites
      • Privacy policy

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *