Цикл foreach php ограничить

Цикл foreach php ограничить

The foreach construct provides an easy way to iterate over arrays. foreach works only on arrays and objects, and will issue an error when you try to use it on a variable with a different data type or an uninitialized variable. There are two syntaxes:

foreach (iterable_expression as $value) statement foreach (iterable_expression as $key => $value) statement

The first form traverses the iterable given by iterable_expression . On each iteration, the value of the current element is assigned to $value .

The second form will additionally assign the current element’s key to the $key variable on each iteration.

Note that foreach does not modify the internal array pointer, which is used by functions such as current() and key() .

In order to be able to directly modify array elements within the loop precede $value with &. In that case the value will be assigned by reference.

$arr = array( 1 , 2 , 3 , 4 );
foreach ( $arr as & $value ) $value = $value * 2 ;
>
// $arr is now array(2, 4, 6, 8)
unset( $value ); // break the reference with the last element
?>

Reference of a $value and the last array element remain even after the foreach loop. It is recommended to destroy it by unset() . Otherwise you will experience the following behavior:

// without an unset($value), $value is still a reference to the last item: $arr[3]

Читайте также:  Bufferedreader in java close

foreach ( $arr as $key => $value ) // $arr[3] will be updated with each value from $arr.
echo » < $key >=> < $value >» ;
print_r ( $arr );
>
// . until ultimately the second-to-last value is copied onto the last value

// output:
// 0 => 2 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 2 )
// 1 => 4 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 4 )
// 2 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
// 3 => 6 Array ( [0] => 2, [1] => 4, [2] => 6, [3] => 6 )
?>

It is possible to iterate a constant array’s value by reference:

Note:

foreach does not support the ability to suppress error messages using @ .

Some more examples to demonstrate usage:

/* foreach example 1: value only */

foreach ( $a as $v ) echo «Current value of \$a: $v .\n» ;
>

/* foreach example 2: value (with its manual access notation printed for illustration) */

$i = 0 ; /* for illustrative purposes only */

foreach ( $a as $v ) echo «\$a[ $i ] => $v .\n» ;
$i ++;
>

/* foreach example 3: key and value */

$a = array(
«one» => 1 ,
«two» => 2 ,
«three» => 3 ,
«seventeen» => 17
);

foreach ( $a as $k => $v ) echo «\$a[ $k ] => $v .\n» ;
>

/* foreach example 4: multi-dimensional arrays */
$a = array();
$a [ 0 ][ 0 ] = «a» ;
$a [ 0 ][ 1 ] = «b» ;
$a [ 1 ][ 0 ] = «y» ;
$a [ 1 ][ 1 ] = «z» ;

foreach ( $a as $v1 ) foreach ( $v1 as $v2 ) echo » $v2 \n» ;
>
>

/* foreach example 5: dynamic arrays */

foreach (array( 1 , 2 , 3 , 4 , 5 ) as $v ) echo » $v \n» ;
>
?>

Unpacking nested arrays with list()

It is possible to iterate over an array of arrays and unpack the nested array into loop variables by providing a list() as the value.

foreach ( $array as list( $a , $b )) // $a contains the first element of the nested array,
// and $b contains the second element.
echo «A: $a ; B: $b \n» ;
>
?>

The above example will output:

You can provide fewer elements in the list() than there are in the nested array, in which case the leftover array values will be ignored:

foreach ( $array as list( $a )) // Note that there is no $b here.
echo » $a \n» ;
>
?>

The above example will output:

A notice will be generated if there aren’t enough array elements to fill the list() :

foreach ( $array as list( $a , $b , $c )) echo «A: $a ; B: $b ; C: $c \n» ;
>
?>

The above example will output:

Notice: Undefined offset: 2 in example.php on line 7 A: 1; B: 2; C: Notice: Undefined offset: 2 in example.php on line 7 A: 3; B: 4; C:

Источник

Как ограничить количество итераций в цикле foreach на PHP?

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

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

А что делать, если вам не нужны все, например, 100 значений, а нужны лишь первые 10?

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

Для начала есть смысл рассмотреть простой пример цикла:

 $array = array( "Shawn Crahan", "Craig Jones", "Mick Thomson", "Corey Taylor", "Sid Wilson", "Chris Fehn", "Jim Root", "Jay Weinberg", "Alessandro Venturella" ); foreach($array as $value) { echo $value."
"; >

«$value» здесь выведет нам имена всех участников группы Slipknot. А теперь сделаем ограничение, чтобы вывод был только первых трех:

 $array = array( "Shawn Crahan", "Craig Jones", "Mick Thomson", "Corey Taylor", "Sid Wilson", "Chris Fehn", "Jim Root", "Jay Weinberg", "Alessandro Venturella" ); $i = 0; // Задаем переменную foreach($array as $value) { $i++; // С каждым обходом увеличиваем переменную на 1 if($i > 3) { break; // При достижении i > 3 останавливаем выборку > echo $value."
"; >

А с помощью следующего варианта выведем все значения после третьего:

 $array = array( "Shawn Crahan", "Craig Jones", "Mick Thomson", "Corey Taylor", "Sid Wilson", "Chris Fehn", "Jim Root", "Jay Weinberg", "Alessandro Venturella" ); $i = 0; // Задаем переменную foreach($array as $value) { $i++; // С каждым обходом увеличиваем переменную на 1 if($i > 3) { // При достижении i > 3 выводим результат echo $value."
"; > >

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

Источник

foreach — ограничение количества циклов в переполнении стека

У меня есть цикл foreach, который мне нужно ограничить первыми 10 пунктами, а затем выйти из него.

Как бы я сделал это здесь?

foreach ($butters->users->user as $user) < $id = $user->id; $name = $user->screen_name; $profimg = $user->profile_image_url; echo "things"; > 

Буду признателен за подробное объяснение.

Решение

Если вы хотите использовать foreach, вы можете добавить дополнительную переменную для контроля количества итераций. Например:

$i=0; foreach ($butters->users->user as $user) < if($i==10) break; $id = $user->id; $name = $user->screen_name; $profimg = $user->profile_image_url; echo "things"; $i++; > 

Другие решения

Вы также можете использовать LimitIterator .

$users = new ArrayIterator(range(1, 100)); // 100 test records foreach(new LimitIterator($users, 0, 10) as $u)

Вы можете просто перебрать array_slice($butters->users->user, 0, 10) (первые 10 элементов).

Используйте счетчик циклов и break когда вы хотите выйти.

$i = 0; foreach ($butters->users->user as $user) < $id = $user->id; $name = $user->screen_name; $profimg = $user->profile_image_url; echo "things"; if (++$i >= 10) < break; >> 

На 10-й итерации цикл завершится в конце.

Существует несколько вариантов этого, и вам нужно выбрать одну вещь: хотите ли вы выполнить условие внешнего цикла или нет. Рассматривать:

foreach (read_from_db() as $row)

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

Если вы уверены, что хотите сохранить foreach цикл, добавить счетчик:

$count = 0; foreach ($butters->users->user as $user) < $id = $user->id; $name = $user->screen_name; $profimg = $user->profile_image_url; echo "things"; $count++; if ($count == 10) break; > 

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

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

Вы можете запустить счетчик перед вашим блоком foreach и проверить его в цикле, а затем отключить, если счетчик равен 10,

$count = 1; foreach ($butters->users->user as $user) < if($count == 10) break; $id = $user->id; $name = $user->screen_name; $profimg = $user->profile_image_url; echo "things"; $count++; > 

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

$arrayobject = new ArrayObject($existingArray); $iterator = $arrayobject->getIterator(); foreach(new LimitIterator($iterator, 0, 10) as $key => $value) < // do something >

Источник

PHP — Как ограничить цикл foreach?

Это простой foreach loop , Как я могу ограничить его значением, указанным в $LimitLoop ?

Как я могу получить только ограниченное количество результатов в этом цикле?

4 ответа

При использовании for Цикл не может быть и речи, тогда вам нужно было бы вручную добавить увеличивающийся счетчик для выполнения той же логики. Что-то вроде этого:

$LimitLoop = 50; $i = 0; foreach ($customers as $customer) < if ($i++ >= $LimitLoop) < break; >// the rest of the loop > 

Вы можете сохранить переменную $i из других примеров, если вы используете что-то вроде этого

$LimitLoop = 50; foreach ($customers as $customer) < /* your code to run */ /* . */ /* at the bottom */ $LimitLoop--; if ($LimitLoop===0) < break; >> 

Вы либо хотите использовать break заявление или использовать for цикл, который работает до $LimitLoop ,

Для цикла (я использую функцию array_keys как $customers может быть ассоциированным массивом или отсутствующими числовыми ключами и т. д. Индексирование массива ключей (которое будет иметь числовой порядок) затем гарантирует, что мы всегда получим следующий ключ):

$keys = array_keys($customers); for ($i = 0; $i < $LimitLoop; $i++) < $customer = $customers[$keys[$i]]; // the rest of your code >

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

$i = 0; foreach ($customers as $customer) < // your code $i++; if ($i >= $LimitLoop) < break; >> 
$customers = Mage::getModel('customer/customer') ->getCollection() ->addAttributeToSelect('*') ->addFieldToFilter('group_id', $groupId); $LimitLoop = 50; $counter = 0; //Add a means of counting how many times it's been through the loop foreach($customers as $customer) < $email=$customer->getEmail(); $CustomerPhone = $customer->getPrimaryBillingAddress()->getTelephone(); $CustomerName = $customer->getName(); $CustomerEmail = $customer->getEmail(); if($EnableSMSNotification==1 && $smstext!="") < $api = new TextMagicAPI(array( "username" =>$TextMagicUsername, "password" => $TextMagicPassword )); // Use this number for testing purposes. This is absolutely free. $phones = array($CustomerPhone); $results = $api->send($smstext, $phones, true); $write = Mage::getSingleton('core/resource')->getConnection('core_write'); $sql_insert = "insert into VivasIndustries_SmsHistory values ('','$CustomerName','$CustomerPhone','$CustomerEmail','$smstext',NOW())"; $write->query($sql_insert); > $counter++; //Increment the counter if($counter >= $LimitLoop) break; //Break the loop if we have enough results > 

Источник

PHP – Как ограничить цикл foreach?

Это простой foreach loop . Как я могу ограничить его значением, указанным в $LimitLoop ?

Как я могу получить только ограниченное число результатов в этом цикле?

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

$LimitLoop = 50; $i = 0; foreach ($customers as $customer) < if ($i++ >= $LimitLoop) < break; >// the rest of the loop > 

вы можете сохранить переменную $ я из других примеров, если вы используете что-то вроде этого

$LimitLoop = 50; foreach ($customers as $customer) < /* your code to run */ /* . */ /* at the bottom */ $LimitLoop--; if ($LimitLoop===0) < break; >> 
$customers = Mage::getModel('customer/customer') ->getCollection() ->addAttributeToSelect('*') ->addFieldToFilter('group_id', $groupId); $LimitLoop = 50; $counter = 0; //Add a means of counting how many times it been through the loop foreach($customers as $customer) < $email=$customer->getEmail(); $CustomerPhone = $customer->getPrimaryBillingAddress()->getTelephone(); $CustomerName = $customer->getName(); $CustomerEmail = $customer->getEmail(); if($EnableSMSNotification==1 && $smstext!="") < $api = new TextMagicAPI(array( "username" =>$TextMagicUsername, "password" => $TextMagicPassword )); // Use this number for testing purposes. This is absolutely free. $phones = array($CustomerPhone); $results = $api->send($smstext, $phones, true); $write = Mage::getSingleton('core/resource')->getConnection('core_write'); $sql_insert = "insert into VivasIndustries_SmsHistory values ('','$CustomerName','$CustomerPhone','$CustomerEmail','$smstext',NOW())"; $write->query($sql_insert); > $counter++; //Increment the counter if($counter >= $LimitLoop) break; //Break the loop if we have enough results > 

Вы либо хотите использовать оператор break либо использовать цикл for который работает до $LimitLoop .

Для цикла (я использую функцию array_keys как $customers может быть ассоциированным массивом или отсутствовать числовые клавиши и т.д. Индексирование массива ключей (который будет иметь числовое упорядочение), тогда мы всегда получаем следующий ключ):

$keys = array_keys($customers); for ($i = 0; $i < $LimitLoop; $i++) < $customer = $customers[$keys[$i]]; // the rest of your code >

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

$i = 0; foreach ($customers as $customer) < // your code $i++; if ($i >= $LimitLoop) < break; >> 

Источник

Оцените статью