Php foreach last one

Последняя итерация foreach

Foreach — каждая вторая итерация с пустым значением
$request = ‘SELECT `category` FROM `’.$table.’` GROUP BY `category` HAVING count(*)>1;’; $result.

почему не срабатывает последняя итерация
подскажите почему не срабатывает и как исправить чтобы был вывод i=3 ? (нужен тип double) .

Цикл foreach: содержимое вывести в таблицу, где каждая строка — это итерация цикла
подскажите, как мне сделать условие в foreach, я хочу содержимое вывести в таблицу, где каждая.

Обработка XML. Цикл foreach (XmlNode.) вложенный во внешний foreach
Здравствуйте. Возникла проблема при обработке XML-файла (с помощью XMLDocument). В теме я новичок.

$array = array(. ); $arrayLength = count($array); $counter = 0; foreach($array as $k => $v){ $counter++; if($counter == $arrayLength){ // последний элемент } }

ЦитатаСообщение от Tatikoma Посмотреть сообщение

ЦитатаСообщение от litbit Посмотреть сообщение

ЦитатаСообщение от Tatikoma Посмотреть сообщение

foreach($a as $b) { $sql2 .= "('$name', '$', '$description', "; } $sql1 = "INSERT INTO `tovar` (`name`, `description`) VALUES "; $sql = $sql1.$sql2; $rs = mysql_query($sql);

в последней итерации в конце станет знак ‘ , ‘ что делает запрос некорректным, а вычисляя последнюю итерацию можно избавиться от запятой в последней итерации

litbit, намного проще удалить последнюю запятую
или посмотреть в сторону implode(), возможно в вашем случае она как раз подходит
Хотя в ПХП есть даже специальная функция для ваших нужд

foreach($a as $b){ // какой-то код if($b == end($a)){ // выполняете что вам нужно } }

cellse, ты хоть сам читал для чего это функция? она возвращает последнее значение массива. Как ты по значению собрался определять конечную итерацию?

Эксперт HTML/CSSЭксперт PHP

ЦитатаСообщение от cellse Посмотреть сообщение

Проще не всегда лучше:
1) Сравнение по строкам будет выполняться дольше
2) Тогда необходимо тождественное сравнение, иначе можете получить неожиданный результат
3) Каждый раз в цикле брать конец массива. Не лучше ли это вынести за цикл?
4) Текущий элемент может равняться последнему

 $arr = array(1, false,"", 0, false); $cnt = count($arr); foreach($arr as $b){ var_dump($b == end($arr)); }

Поэтому, все же, лучше использовать count.

ЦитатаСообщение от Tatikoma Посмотреть сообщение

$array = array(. ); $arrayLength = count($array); $counter = 0; foreach($array as $k => $v){ * * $counter++; * * if($counter == $arrayLength){ * * * * // последний элемент * * } }
$array = array(. ); $arrayLength = count($array); $counter = 0; foreach($array as $k => $v){ if(++$counter == $arrayLength){ // последний элемент } }
$array = array(. ); $arrayLength = count($array); foreach($array as $k => $v){ if( ! --$arrayLength){ // последний элемент } }

ЦитатаСообщение от litbit Посмотреть сообщение

как-то он некорректно собирается, скобки не хватает, как минимум.. Ну и экранирования данных тоже нет

Эксперт HTML/CSSЭксперт PHP

Согласен, что не всегда, но как вариант рассматривать можно, согласитесь.

Эксперт HTML/CSSЭксперт PHP

ЦитатаСообщение от KOPOJI Посмотреть сообщение

Кстати, для ускорения тут можно запросто использовать тождественное сравнение, т.к. и там, и там — заведомо целые числа

Добавлено через 1 минуту
cellse, нельзя, не в этом случае.
Именно здесь нельзя потому, что данные, судя по всему, заполняются из формы или еще откуда-то — а их могут и не заполнить, итого получим пустоту. Чем это чревато видно в примере

ЦитатаСообщение от KOPOJI Посмотреть сообщение

как-то он некорректно собирается, скобки не хватает, как минимум.. Ну и экранирования данных тоже нет

мне кажется вы что-то путаете.
Скобок хватает — запрос отрабатывает.
Данные не экранируются?
Тогда что это?

KOPOJI, litbit, нашел я тут одну штукенцию, которая все это упрощает, избавляет от всего лишнего. странно, что никто не предложил

foreach ($array as $key => $value) { // do something. if (!next($array)) { // do something for last element } }

Эксперт HTML/CSSЭксперт PHP

ЦитатаСообщение от Sombrero Посмотреть сообщение

лично я просто не очень люблю в цикле вызывать функции, которые работают со всем массивом, ресурсоемко..
Ну а, помимо этого, возможна такая же ошибка с false и приведением типов. Если заменить «!» на тождественное сравнение с FALSE, то это уменьшит риск ошибки, но оставит ошибку, если в массиве может содержаться значение FALSE , как таковое. Вариант с длиной массива мне все таки больше нравится. Хотя если по-нормальному, то тут все это и не надо, достаточно rtrim

ЦитатаСообщение от Sombrero Посмотреть сообщение

$array = array(. ); $arrayLength = count($array); $query = '. '; foreach($array as $k => $v) $query .= --$arrayLength ? '. = "' . $v. '", ' : '. = "' . $v. '" ';

ЦитатаСообщение от KOPOJI Посмотреть сообщение

foreach($a as $b){ // какой-то код if($b == end($a)){ // выполняете что вам нужно } }

Эксперт HTML/CSSЭксперт PHP

ЦитатаСообщение от KOPOJI Посмотреть сообщение

Кстати, для ускорения тут можно запросто использовать тождественное сравнение, т.к. и там, и там — заведомо целые числа

Это не то чтобы экономия на спичках, это экономия на сере на этой самой спичке.. Разница в один jnz, т.к. тип переменных и без того одинаковый, или я что-то путаю?

ЦитатаСообщение от litbit Посмотреть сообщение

в последней итерации в конце станет знак ‘ , ‘ что делает запрос некорректным, а вычисляя последнюю итерацию можно избавиться от запятой в последней итерации

Есть подозрение что сделать вот так один раз после цикла — несколько короче код и дешевле в плане спичек.

Лично я предпочел бы реализовывать эту конструкцию без циклов в принципе, — функций для работы с массивами вполне себе предостаточно. Оно вероятно будет чуть требовать чуть больше спичек, но это код на PHP — тут читабельность важнее микро-оптимизаций.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
function insertIntoTable($tableName, $fields){ if(!count($fields)){ throw new Exception('Incorrect function call.'); } $sql = "INSERT INTO ` `"; $sql .= '(`' . implode('`,`', array_keys($fields)) . '`)'; $fields = array_map(function($item){ return mysql_real_escape_string($item); }, $fields); $sql .= ' VALUES(\'' . implode('\',\'', $fields) . '\')'; return mysql_query($sql); } insertIntoTable('users', array( 'user_id' => '1', 'username' => 'vasya', 'password' => 'secret', ));

Источник

Php foreach last one

Один вариант уже был (для сравнения его тоже приведу), теперь ещё один:

foreach ($array as $key => $value) < if($value == end($array)) < // делаем что-либо с последним элементом. >else < // делаем что-либо с каждым элементом >>
foreach ($array as $key => $value) < if (!next($array)) < // делаем что-либо с последним элементом. >else < // делаем что-либо с каждым элементом >>

Спасибо dkrnl. Устроил тест.

Вариант №1 работает только если явно задать ключи:

$array = array('1' => '1','2' => '2','3' => '3', '4'=>'4','5'=>'5');

Вариант №2 работает только если массив передать по ссылке:

$array = new ArrayObject(array(1,2,3,4,5));

Работающий в любом случае вариант:

$total = count($array); $counter = 0; foreach($array as $key => value) < $counter++; if($counter == $total)< // делаем что-либо с последним элементом. >else < // делаем что-либо с каждым элементом >>

А ведь и правда стало смахивать на for 🙂 Неудобство в том, что при обращении к элементу в случае с for придётся использовать индекс.

Неплохое решение DeadLy:

$end_element = array_pop($array); foreach ($array as $value) < // делаем что-либо с каждым элементом >// делаем что-либо с последним элементом $end_element

Комментарии RSS по email OK

это не рабочий код — внутри foreach нельзя перемешать(reset,end,next. ) внутренний указатель перебираемого массива.

echo "php: ", PHP_VERSION; echo " "; echo "v1: "; $array = array(1,2,3,4,5); foreach ($array as $key => $value)  echo $value; if($key != end($array))  echo ", "; > > echo " "; echo "v2: "; foreach ($array as $key => $value)  echo $value; if (next($array))  echo ", "; > >

результат: php: 5.2.4 v1: 1, 2, 3, 4, 5, v2: 1, 2, 3, 45 В первом случаи все безтолку, во втором внутрений указатель «калбасит».

про end: mixed end ( array &$array ) end() устанавливает внутренний указатель array на последний элемент и возвращает его значение. про next: mixed next ( array &$array ) Возвращает значение элемента массива, находящегося на позиции, следующей за позицией, в которой находится его внутренний указатель или FALSE, если достигнут конец массива. про foreach: Замечание: When foreach first starts executing, the internal array pointer is automatically reset to the first element of the array. This means that you do not need to call reset() before a foreach loop. Замечание: Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself. foreach has some side effects on the array pointer. Don’t rely on the array pointer during or after the foreach without resetting it.

$array = array('1' => '1','2' => '2','3' => '3', '4'=>'4','5'=>'5');
$array = new ArrayObject(array(1,2,3,4,5));
$total = count($array); $counter = 0; foreach ($array as $key => value) $counter++; if ($counter == $total) // делаем что-либо с последним элементом. > else  // делаем что-либо с каждым элементом > >

«И как это зависит от сервера?» сужу только по своему опыту Делал так в одном из проектов, локально работало, на хостинге фирмы тоже работало, залили на хостинг заказчика перестало работать, не end не next в foreach корректно не работал. причину выяснять времени небыло, быстрее было переписать на for.

Ну, скорее это зависило от версии PHP, нежели от сервера. Вообще, как видно, вприанты с for и счётчиком — единственные стабильные из рассмотренных.

$end_element = array_pop($array); foreach ($array as $value)  // делаем что-либо с каждым элементом > // делаем что-либо с последним элементом. 

Ну, это не совсем то: нам нужно сделать с последним что-то уникальное. Допустим, вывести все на печать с запятой, а последний — с точкой.

$array = array(1,2,3); $end_element = array_pop($array); foreach ($array as $value)  echo $value.' - !'; > echo $end_element.' - Последний элемент';
$values = '1,2,3,4,5,'; // результат работы foreach $values = substr($values,0,-1); echo $values; //результат 1,2,3,4,5

Эмм, народ, вы меня умиляете. Есть два простейших способа. Первый заключается в том, что бы генерировать листинг тагов зарание правильно:

$tag_list = Array(); foreach ($someDataSource as $item)  // code here $tag_list[] = $item['someTagData'] > $tag_list = implode(',', $tag_list); echo $tag_list; // tag1, tag2, . tagN
$str = 'tag1, tag2, . tagN,'; $str = trim($str, ',');

Источник

Determine the First and Last Iteration in a Foreach Loop in PHP

Determine the First and Last Iteration in a Foreach Loop in PHP

  1. PHP foreach() Syntax
  2. Get the First and Last Item in a foreach() Loop in PHP

PHP foreach() loop is being used to loop through a block of code for each element in the array. In this article, we’ll figure out how to use foreach() loop and how to get the first and last items of an array.

PHP foreach() Syntax

The foreach() loop is mainly used for iterating through each value of an array.

for($array as $key => $value)  // Add code here  > 
  • $array — This must be a valid array to use in a loop; If the array passed isn’t valid or a string, return an error like: (Warning: Invalid argument supplied for foreach()).
  • $key — It is the element’s key on each iteration.
  • $value — It is the element’s value on each iteration.

Get the First and Last Item in a foreach() Loop in PHP

There are several approaches to get the first and last item in a loop using PHP and it varies on different versions.

These are, by using counter (works for all version), using array_key_first() and array_key_last() for PHP 7.3.

Use Counter in PHP foreach Loop

Adding an integer variable and placing the counter at the bottom of the foreach() loop.

$array = array("dog", "rabbit", "horse", "rat", "cat"); $x = 1; $length = count($array);  foreach($array as $animal)  if($x === 1)  //first item  echo $animal; // output: dog  >else if($x === $length)  echo $animal; // output: cat  >  $x++; > 

In the above example, the list of animals is stored as an array.

Then set the $x as 1 to start the counter.

Use count() to determine the total length of an array. The iteration of the counter was placed at the bottom of the foreach() loop — $x++; to execute the condition to get the first item.

To get the last item, check if the $x is equal to the total length of the array. If true , then it gets the last item.

Use array_key_first() and array_key_last() in PHP Loop

With the latest version of PHP, getting the first and last item in an array can never be more efficient.

$array = array("dog", "rabbit", "horse", "rat", "cat"); foreach($array as $index => $animal)   if ($index === array_key_first($array))  echo $animal; // output: dog   if ($index === array_key_last($array))  echo $animal; // output: cat  > 

In the example above, array_key_first() gets the key of the first item in the array, in this case, it’s 0 .

Then array_key_last() gets the last key of the array, in this case, 5 .

By inspecting the array, the item that is sitting in the 0 key is the dog which is the first and in the 5th key, is the cat which is the last item.

Related Article — PHP Loop

Related Article — PHP Array

Источник

Читайте также:  Отличие scanner от bufferedreader java
Оцените статью