php определить последний элемент массива
Как получить последний элемент массива в PHP
Имеется много способов извлечь последний элемент массива в PHP скрипте. Они различаются своим воздействием на массив (могут удалять извлечённый элемент, либо сдвигать указатель), а также своей производительностью.
Вариант 1
Начиная с PHP 7.3 наконец-то добавлена специальная функция, которая получает последний ключ массива, это функция array_key_last.
Обратите внимание, что извлекается не последний элемент массива, а именно последний ключ, поэтому для получения самого последнего члена массива эту функцию нужно использовать следующим образом:
Бенчмарки производительности показывают, что это самый быстрый вариант, поэтому рекомендуется использовать именно его.
Поскольку PHP 7.3 на момент написания является совсем недавним стабильным релизом, то эта версия доступна ещё не на всех серверах. Для достижения совместимости, рекомендуется использовать следующий код:
Этот код проверяет, доступна ли функция array_key_last. Если эта функция недоступна, то создаётся пользовательская функция с таким же именем, которая выполняет это же самое действие. Результатом этого будет то, что на PHP версии 7.3 и более поздних будет использоваться оригинальная функция array_key_last, а на более старых версиях будет задействована пользовательская функция array_key_last.
Рассмотрим ещё варианты, которые подойдут для более старых версий PHP.
Некоторые из рассмотренных вариантов могут показаться излишне усложнёнными, но это сделано для того, чтобы убрать воздействие на массив. К примеру, нужное действие (получение последнего элемента массива) может выполнять функция array_pop, но она не используется сама по себе (хотя применяется в некоторых рассмотренных конструкциях), поскольку в результате её действия удаляется извлекаемый элемент.
Вариант 2
Вариант 3
Вариант 4
Вариант 5
Вариант 6
На больших массивах также работает хорошо.
Эта опция сбивает внутренний указатель массива.
Вариант 7
В последних версиях PHP этот вариант стал очень медленным. Рекомендуется его избегать.
Этот вариант создан в надежде сохранить внутренний указатель массива (что является недостатком предыдущего варианта), но, к сожалению, на больших массивах работает сильно медленнее.
Вариант 8
На больших массивах также работает хорошо.
Из-за использования count рекомендуется использовать только на автоиндексируемых массивах.
Вариант 9
В последних версиях PHP этот вариант стал очень медленным. Рекомендуется его избегать.
Вариант 10
На больших массивах также работает хорошо.
Из-за того, что получение значения приводит к потере оригинального ключа рекомендуется использовать только на авто индексируемых массивах.
Заключение
Все рассмотренные ограничения снимаются новой функцией array_key_last, поэтому в конечном счёте рекомендует использовать именно её.
Найти последний элемент массива при использовании цикла foreach в PHP
Я пишу SQL query creator, используя некоторые параметры. В Java очень легко обнаружить последний элемент массива изнутри цикла for, просто проверив текущую позицию массива с длиной массива.
в PHP они имеют нецелые индексы для доступа к массивам. Поэтому вы должны перебирать массив, используя цикл foreach. Это становится проблематичным, когда вам нужно принять какое-то решение (в моем случае добавить или/и параметр при построении запроса).
Я уверен, что должен быть какой-то стандартный способ сделать это.
Как вы решаете это в PHP?
29 ответов
похоже, вы хотите что-то вроде этого:
это, как говорится, вам не нужно перебирать «массив», используя foreach в php.
вы можете получить значение последнего ключа массива, используя end(array_keys($array)) и сравните его с текущим ключом:
Это добавит a, за каждым значением, кроме последнего!
когда toEnd достигает 0, это означает, что он находится на последней итерации цикла.
последнее значение все еще доступно после цикла, поэтому, если вы просто хотите использовать его для большего количества вещей после цикла, это лучше:
если вы не хотите рассматривать последнее значение как специальные внутренние циклы. Это должно быть быстрее, если у вас большие массивы. (Если вы повторно используете массив после цикла внутри той же области, вам нужно «скопировать» массив сначала.)
и ответить на ваш исходный вопрос «в моем случае, чтобы добавить или / и параметр при построении запроса»; это будет цикл над всеми значениями, А затем объединить их вместе в строку с » и » между ними, но не до первого значения или после последнего значения:
ответов уже много, но стоит посмотреть и на итераторы, тем более, что его попросили стандартным способом:
вы можете найти что-то, что работает более гибко и для других случаев.
Итак, если Ваш массив имеет уникальные значения массива, то определение последней итерации тривиально:
Как вы видите, это работает, если последний элемент появляется только один раз в массиве, иначе вы получаете ложную тревогу. В нем нет, вы должны сравнить ключи (которые уникальны наверняка).
также обратите внимание на строгий оператор coparision, что довольно важно в этом случае.
предполагая, что массив хранится в переменной.
Если вам нужно что-то сделать для каждого элемента, кроме первого или последнего, и только если в массиве более одного элемента, я предпочитаю следующее решение.
Я знаю, что есть много решений выше и опубликовано месяцев / за год до моего, но это то, что я чувствую, довольно элегантно само по себе. Проверка каждого цикла также является логической проверкой, а не числовой проверкой» i=(count-1)», которая может позволить меньше накладных расходов.
структура цикл может показаться неудобным, но вы можете сравнить его с порядком thead (начало), tfoot (конец), tbody (текущий) в тегах HTML-таблицы.
например, в терминах веб-разработки, если вы хотите добавить border-bottom для каждого элемента, кроме последнего в неупорядоченном списке (ul), то вы можете вместо этого добавить border-top для каждого элемента, кроме первого (CSS: first-child, поддерживаемый IE7+ и Firefox / Webkit поддерживает эту логику, тогда как : last-child не поддерживается IE7).
Php определить последний элемент массива
(PHP 4, PHP 5, PHP 7, PHP 8)
end — Устанавливает внутренний указатель массива на его последний элемент
Описание
end() устанавливает внутренний указатель array на последний элемент и возвращает его значение.
Список параметров
Массив. Этот массив передаётся по ссылке, потому что он модифицируется данной функцией. Это означает что вы должны передать его как реальную переменную, а не как функцию, возвращающую массив, так как по ссылке можно передавать только фактические переменные.
Возвращаемые значения
Возвращает значение последнего элемента или false для пустого массива.
Примеры
Пример #1 Пример использования end()
Смотрите также
User Contributed Notes 15 notes
It’s interesting to note that when creating an array with numeric keys in no particular order, end() will still only return the value that was the last one to be created. So, if you have something like this:
If you need to get a reference on the first or last element of an array, use these functions because reset() and end() only return you a copy that you cannot dereference directly:
This function returns the value at the end of the array, but you may sometimes be interested in the key at the end of the array, particularly when working with non integer indexed arrays:
If all you want is the last item of the array without affecting the internal array pointer just do the following:
I found that the function end() is the best for finding extensions on file name. This function cleans backslashes and takes the extension of a file.
Attempting to get the value of a key from an empty array through end() will result in NULL instead of throwing an error or warning becuse end() on an empty array results in false:
Please note that from version 5.0.4 ==> 5.0.5 that this function now takes an array. This will possibly break some code for instance:
this is a function to move items in an array up or down in the array. it is done by breaking the array into two separate arrays and then have a loop creates the final array adding the item we want to move when the counter is equal to the new position we established the array key, position and direction were passed via a query string
When adding an element to an array, it may be interesting to know with which key it was added. Just adding an element does not change the current position in the array, so calling key() won’t return the correct key value; you must first position at end() of the array:
Take note that end() does not recursively set your multiple dimension arrays’ pointer to the end.
// show the array tree
echo ‘
?>
You will notice that you probably get something like this:
The array elements’ pointer are still at the first one as current. So do take note.
array_pop
(PHP 4, PHP 5, PHP 7, PHP 8)
array_pop — Извлекает последний элемент массива
Описание
Замечание: Эта функция при вызове сбрасывает указатель массива, переданного параметром.
Список параметров
Массив, из которого берётся значение.
Возвращаемые значения
Ошибки
При вызове этой функции с не массивом будет вызвана ошибка уровня E_WARNING.
Примеры
Пример #1 Пример использования array_pop()
Смотрите также
User Contributed Notes 16 notes
I wrote a simple function to perform an intersect on multiple (unlimited) arrays.
Pass an array containing all the arrays you want to compare, along with what key to match by.
will return a : Array ( [0] => )
so u can fix it using.
For the sake of array_unshift()
🙂
I had a problem when using this function because my array was made up entirley of numbers, so I have made my own function. Hopefully it will be useful to somebody.
Note that array_pop doesn’t issue ANY warning or error if the array is already empty when you try to pop something from it. This is bizarre! And it will cause cascades of errors that are hard to resolve without knowing the real cause.
Rather than an error, it silently returns a NULL object, it appears, so in my case I ended up with warnings elsewhere about accessing elements of arrays with invalid indexes, as I was expecting to have popped an array. This behaviour (and the lack of any warning, when many trivial things are complained about verbosely) is NOT noted in the manual above. Popping an already empty stack should definitely trigger some sort of notice, to help debugging.
Sure, it’s probably good practice to wrap the pop in an if (count($array)) but that should be suggested in the manual, if there’s no error returned for trying something that should fail and obviously isn’t expected to return a meaningful result.
alex.chacon@terra.com
Hi
Here there is a function that delete a elemente from a array and re calculate indexes
strrchr is a lot more useful than the other example using array_pop for finding the extension of a file. For example:
Notice that, you should assign a variable for function explode, then pass the variable reference into array_pop to avoid the Strict Standard warning.
@smp_info
I think you are still tired. What would be wrong with:
//$array == array(‘one’, ‘two’, ‘three’);
?>
As the documentation clearly notes, array_pop() not only returns the last element, but actually removes it from the array wich is passed by reference. Calling array_diff is a waste of resources.
Quick way to get the extension from a file name using array_pop:
current
(PHP 4, PHP 5, PHP 7, PHP 8)
current — Возвращает текущий элемент массива
Описание
У каждого массива имеется внутренний указатель на его «текущий» элемент, который инициализируется первым элементом, добавленным в массив.
Список параметров
Возвращаемые значения
Примеры
Пример #1 Пример использования current() и дружественных функций
Примечания
Смотрите также
User Contributed Notes 14 notes
current() also works on objects:
Note, that you can pass array by expression, not only by reference (as described in doc).
To that «note»: You won’t be able to distinguish the end of an array from a boolean FALSE element, BUT you can distinguish the end from a NULL value of the key() function.
You should do an end($my_array) to advance the internal pointer to the end ( as stated in one of the notes on end() ), then
Note that by copying an array its internal pointer is lost:
Array can be passed by both REFERENCE and EXPRESSION on `current`, because current doesn’t move array’s internal pointer,
this is not true for other functions like: `end`, `next`, `prev` etc.
It took me a while to figure this out, but there is a more consistent way to figure out whether you really went past the end of the array, than using each().
You see, each() gets the value BEFORE advancing the pointer, and next() gets the value AFTER advancing the pointer. When you are implementing the Iterator interface, therefore, it’s a real pain in the behind to use each().
Nifty, huh? Here’s how I implemented the Iterator interface in one of my classes:
/**
* This class lets you use Db rows and object-relational mapping functionality.
*/