php foreach определить последний элемент

Как определить первую и последнюю итерации в цикле foreach?

вопрос простой. У меня есть foreach цикл в моем коде:

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

18 ответов:

вы можете использовать счетчик:

Если вы предпочитаете решение, которое не требует инициализации счетчика вне цикла, я предлагаю сравнить текущий ключ итерации с функцией, которая сообщает вам последний / первый ключ массива.

это становится несколько более эффективным (и более читаемым) с предстоящим PHP 7.3.

решение для PHP 7.3 и выше:

решение для всех версий PHP:

, чтобы найти последний элемент, я нашел этот кусок кода работает каждый раз:

более упрощенная версия выше и если вы не используете пользовательские индексы.

Версия 2-потому что я пришел к ненависти, используя остальное, если это не необходимо.

вы можете удалить первый и последний элементы из массива и обрабатывать их отдельно.
Вот так:

удаление всего форматирования в CSS вместо встроенных тегов улучшит ваш код и ускорит время загрузки.

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

1: Почему бы не использовать простой for заявление? Предполагая, что вы используете реальный массив, а не Iterator вы можете легко проверить, является ли переменная счетчика 0 или одним меньше, чем все количество элементов. На мой взгляд это самое чистое и понятное решение.

2: Вы должны рассмотреть, используя Вложенные Наборы для хранения структуры дерева. Кроме того, вы можете улучшить все это с помощью рекурсивной функции.

для сценариев генерации SQL-запросов или всего, что выполняет другое действие для первого или последнего элемента, это намного быстрее (почти в два раза быстрее), чтобы избежать использования ненужных проверок переменных.

текущее принятое решение использует цикл и проверку в цикле, которая будет выполнена every_single_iteration, правильный (быстрый) способ сделать это следующим образом :

небольшой самодельный бенчмарк показал следующее:

тест1: 100000 работает модели морг

время: 1869.3430423737 миллисекунд

test2: 100000 запусков модели, если последний

время: 3235.6359958649 миллисекунд

и таким образом совершенно ясно, что проверка стоит много, и, конечно, она становится еще хуже, чем больше переменных проверок вы добавляете 😉

The array_keys функцию можно использовать для того чтобы сделать эффективную работу ответа как foreach :

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

если ты хочешь functionalize такого рода вещи, я замахнулся на такой функция iterateList здесь. Хотя, возможно, вы захотите проверить код gist, если вы очень обеспокоены об эффективности. Я не уверен, сколько накладных расходов вводит весь вызов функции.

и я предпочитаю использовать for петли вместо foreach если бы я собирался использовать счетчик, как это:

Источник

Найти последний элемент массива при использовании цикла 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 скрипте. Они различаются своим воздействием на массив (могут удалять извлечённый элемент, либо сдвигать указатель), а также своей производительностью.

Вариант 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, поэтому в конечном счёте рекомендует использовать именно её.

Источник

Php foreach определить последний элемент

You can also use the alternative syntax for the foreach cycle:

I cannot stress this point of the documentation enough! Here is a simple example of exactly why this must be done:

Even though it is not mentioned in this article, you can use «break» control structure to exit from the «foreach» loop.

WARNING: Looping through «values by reference» for «extra performance» is an old myth. It’s actually WORSE!

?>

Which do you think is faster?

Lots of people think the answer is two() because it uses «reference to value, which it doesn’t have to copy each value when it loops».

Well, that’s totally wrong!

Here’s what actually happens:

Alright, so what’s the second version doing? The beloved «iterate values by reference»?

— This function takes an array as argument ($arr).
— The array function argument itself isn’t passed by reference, so the function knows it isn’t allowed to modify the original at all.
— Then the foreach loop happens. The array itself wasn’t passed by reference to the function, so PHP knows that it isn’t allowed to modify the outside array.
— But it also sees that you want to look at all VALUES by reference (&$val), so PHP says «Uh oh, this is dangerous. If we just give them references to the original array’s values, and they assign some new value to their reference, they would destroy the original array which they aren’t allowed to touch!».
— So PHP makes a FULL COPY of the ENTIRE array and ALL VALUES before it starts iterating. YIKES!

Therefore: STOP using the old, mythological «&$val» iteration method! It’s almost always BAD! With worse performance, and risks of bugs and quirks as is demonstrated in the manual.

You can always manually write array assignments explicitly, without references, like this:

Источник

Foreach PHP: последний элемент

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

php foreach определить последний элемент. Смотреть фото php foreach определить последний элемент. Смотреть картинку php foreach определить последний элемент. Картинка про php foreach определить последний элемент. Фото php foreach определить последний элемент

«Массивные» возможности PHP

Массивы всегда были востребованным понятием в программировании, а в последнее время приобрели новый смысл и синтаксические формы. Цикл foreach PHP и понятие «последний элемент» в некотором смысле эквивалентны, а отличаются только направлением движения:

В обоих случаях можно создавать массивы, как получается, а посмотреть всегда можно все. Оба случая открывают возможность уложить в синтаксис PHP собственную семантику.

В первом случае официально цикл просматривает все элементы в порядке их появления в массиве или в том порядке, который сложился после манипуляций с ним. Во втором случае процесс тот же, но происходит с хвоста массива к его началу.

php foreach определить последний элемент. Смотреть фото php foreach определить последний элемент. Смотреть картинку php foreach определить последний элемент. Картинка про php foreach определить последний элемент. Фото php foreach определить последний элемент

О порядке в массивах

Многие задачи или части алгоритма предписывают создавать упорядоченные массивы и тогда ключи всегда идут по порядку.

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

Обычный перебор элементов в цикле for() интересен и имеет смысл, когда ключи идут последовательно. У каждого массива всегда есть ключ по порядку. Когда удаляется элемент, образуется пустое место и в цикле for() будет ошибка.

php foreach определить последний элемент. Смотреть фото php foreach определить последний элемент. Смотреть картинку php foreach определить последний элемент. Картинка про php foreach определить последний элемент. Фото php foreach определить последний элемент

О предусмотренном синтаксисе

Когда оператор foreach PHP начинает работу, внутренний указатель массива всегда устанавливается на его первый элемент. Изменение указателя внутри цикла может привести к чудесам.

Ошибки foreach, PHP последний элемент = ок!

php foreach определить последний элемент. Смотреть фото php foreach определить последний элемент. Смотреть картинку php foreach определить последний элемент. Картинка про php foreach определить последний элемент. Фото php foreach определить последний элемент

Если элемент не того типа, это будет заметно так же, как и в основном теле программы.

Массивы и объекты

PHP предоставляет возможность рассматривать объекты как массивы. Какой в этом смысл сказать трудно, но подобное доступно. Массивы могут содержать значения любого типа и менять его в процессе исполнения программы. Естественно, элементом массива может быть другой массив или объект. Уровень вложенности ограничен здравым смыслом.

Операторы и конструкции языка не имеют ничего общего ни с рекурсией, ни с уровнем вложенности. Это серьезное отставание синтаксиса управляющих конструкций от синтаксиса описания данных. Разработчики привыкли к таким явлениям, как PHP массивы, foreach, array_pop, поэтому работать с ними удобно.

Перспектив, что управляющие конструкции будут изменяться (даже в далеком будущем) пока вовсе не предвидится.

php foreach определить последний элемент. Смотреть фото php foreach определить последний элемент. Смотреть картинку php foreach определить последний элемент. Картинка про php foreach определить последний элемент. Фото php foreach определить последний элемент

Массивы объектов (начало)

Надо отдать должное, что появление парочки foreach/array_pop не заставило себя долго ждать, но это только половина дела. По большому счету циклам for()<>, while() <> и do<>while() давно пора взять на себя надлежащий контроль за пустотами в массивах и решение проблемы рекурсии, когда элементом является массив.

Проблема здесь не подлежит решению в обозримом будущем, даже с учетом роста скорости развития информационных технологий. Вследствие чего приходится довольствоваться тем, что есть.

Простейшие массивы (вставка)

php foreach определить последний элемент. Смотреть фото php foreach определить последний элемент. Смотреть картинку php foreach определить последний элемент. Картинка про php foreach определить последний элемент. Фото php foreach определить последний элемент

Например, цифры двоичной системы вычисления. Аналогично:

Сказать, что простейшим будет массив месяцев можно, но только при определенных условиях, поскольку в большинстве случаев потребуется цифровое представление месяца, трехбуквенное, русское, китайское, полное или еще какое-нибудь.

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

Массивы объектов (продолжение)

Если отказаться от любых иных вариантов типа элемента, помимо объекта и простейшего массива, то все получится совершенно замечательно даже в руках современных управляющих конструкций языка, сохранивших свою сущность с давних времен.

Известно, что объект совмещает данные и методы, память и действие. Общая практика объектно-ориентированного программирования, понимаемая многими, это некий абстрактный объект, у которого ничего нет, а все только намечается.

php foreach определить последний элемент. Смотреть фото php foreach определить последний элемент. Смотреть картинку php foreach определить последний элемент. Картинка про php foreach определить последний элемент. Фото php foreach определить последний элемент

Источник

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

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