Чтобы решить вашу проблему, вы можете собрать количество сегментов из общих элементов ваших данных с определенным размером элементов на сегмент. Затем вы можете перебирать сегменты, и внутри каждого сегмента вы выводите ( Демо ):
$data = range(1, 32); # fake data
foreach(array_chunk($data, 5) as $items)
{
# output per each segment:
echo '<div>';
foreach($items as $item)
{
echo $item , " ";
}
echo '</div>', "\n";
}
Или для более самостоятельной порции ( Демо ):
<?php
$data = range(1, 15); # fake data
$size = 5; # elements per div
$segments = range(1, count($data), $size); # segments
# iterate over segments if there are segments
if ($segments) while(each($segments))
{
# output per each segment:
echo '<div>';
# iterate over the next $data elements, with a maximum of $size
for($c = $size; $c-- && list($key, $item) = each($data);)
{
echo $item , " ";
}
echo '</div>', "\n";
}
Если у вас есть проблема более одного раза внутри вашего приложения, и вы хотите повторно использовать некоторый код, вы можете инкапсулировать необходимую логику внутри итератора, если он собственный:
class ArraySegments extends ArrayIterator {
private $s;
/**
* @param array $array
* @param int $size of segment
*/
public function __construct(array $array, $size) {
$this->s = max(1, $size);
parent::__construct($array);
}
public function current() {
$segment = array();
$c = $this->s;
while($c && $this->valid()) {
$segment[] = parent::current();
--$c && $this->next();
}
return $segment;
}
}
Используется как таковой:
$data = range(1, 15); # fake data
foreach(new ArraySegments($data, 5) as $elements) {
printf(":::\n");
foreach($elements as $element)
printf(" - %s\n", $element)
;
printf(";;;\n");
}
Просто передайте массив, который вы хотите перебрать ($data
), и количество элементов на сегмент (5
в примере). Внутри внешнего foreach у вас есть максимум 5 элементов в массиве $elements
. Пример вывода:
:::
- 1
- 2
- 3
- 4
- 5
;;;
:::
- 6
- 7
- 8
- 9
- 10
;;;
:::
- 11
- 12
- 13
- 14
- 15
;;;