PHP для цикла для рендеринга ограниченных данных - PullRequest
2 голосов
/ 09 июля 2011

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

Твист - это поток игрока.

Один div может нести 5 предметов, вот так мне нужно добавить 4 div.

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

Я попробовал следующий код, но он просто отображает начальные 5, Как я могу отобразить следующие 5 в другом div и т. Д. .....

$i = 0;
foreach($data as $idx=>$project_name)
{
    echo '<div>';
    echo $project_name['ProjectImage'];
    echo '</div>';
    if (++$i == 5) break;

}

А логика, которая мне поможет?

Ответы [ 6 ]

1 голос
/ 09 июля 2011
$i = 0;
foreach($data as $var=>$val) {
   if ($i == 0) echo '<div>';
   echo $project_name['val'];
   $i++;
   if ($i == 5) { 
      echo '</div>';
      $i = 0;
   }
}

в вашем коде BREAK - единственная проблема ... break остановит выполнение цикла и выведет вас из цикла.этот код будет хорошо работать для вас

0 голосов
/ 09 июля 2011

Я бы использовал array_chunk() функцию для первого разбиения массива на куски.

0 голосов
/ 09 июля 2011

Чтобы решить вашу проблему, вы можете собрать количество сегментов из общих элементов ваших данных с определенным размером элементов на сегмент. Затем вы можете перебирать сегменты, и внутри каждого сегмента вы выводите ( Демо ):

$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
;;;
0 голосов
/ 09 июля 2011
$i = 1;
foreach($data as $idx=>$project_name) {
   if ($i == 1 || $i % 6 ==0) echo '<div>';
   echo $project_name['ProjectImage'];
   $i++;
   if ( $i % 6 == 0 || sizeof($data) == ( $i -1) ) {
      echo '</div>';
}
0 голосов
/ 09 июля 2011

Я бы сделал:

$i = 1;
foreach($data as $idx=>$project_name)
{
 if (($i = 1) || (($i % 5) == 0)){
    echo '<div>';
}
    echo $project_name['ProjectImage'];
 if (($i = 1) || (($i % 5) == 0)){
    echo '</div>';
}
$i++

}
0 голосов
/ 09 июля 2011
$i = 0;
foreach($data as $idx=>$project_name) {
   if ($i == 0) echo '<div>';
   echo $project_name['ProjectImage'];
   $i++;
   if ($i == 5) { 
      echo '</div>';
      $i = 0;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...