проблема зацикливания php - PullRequest
       3

проблема зацикливания php

0 голосов
/ 19 октября 2011

Мне нужна ваша помощь с проблемой зацикливания, это так раздражает, когда мозг просто перестает функционировать.

Вот что я хочу сделать:

  1. Iу нас есть массив с некоторым количеством данных, скажем, [6] в этом случае

  2. Из длины этого массива я создаю определенное количество элементов div.Каждый div будет содержать максимум 5 значений массива.Итак, число делений, которые будут созданы = раунд (размер массива / 5), поэтому в этом случае 2 деления.

Пока все хорошо, но теперь я не могуВычислять.Как мне создать цикл, который печатает индекс 0-4 в div 1, а затем идет вперед и создает второй div для вывода индекса 5-6 in.

И, конечно, все должно быть динамически, так что еслиУ меня есть 20 значений в массиве, который он будет создавать и заполнять значениями 4 деления.

Заранее спасибо!

Редактировать: Спасибо всем за ваши решения!

Ответы [ 8 ]

1 голос
/ 19 октября 2011

посмотрите на array_chuck, который разбивает массив на части http://php.net/manual/en/function.array-chunk.php

// sample data
$rows = array('a','b','c','d','e','f');

$chunks = array_chunk($rows, 3); // ajust to suit number of rows per chunk

foreach ($chunks as $chunk):
  echo '<div>';

  foreach ($chunk as $row):
    echo $row;
  endforeach;

  echo '</div>';
endforeach;
0 голосов
/ 19 октября 2011

Уже есть несколько решений. Шахта протестирована и работает с использованием одного контейнера на каждые 5 элементов данных:

<?php

// any iterable data, not necessarily array
$data = array('a','b','c','d','e','f','g','h','i','j','k','l','m');

$counter = 0;

foreach ($data as $data_part) {
    if ($counter % 5 === 0) {
        echo '<div>'; // open container (div?) here
    }
    echo '(' . $counter . ':' . $data_part . ')';
    if ($counter % 5 === 4) {
        echo '</div>' . PHP_EOL; // close container (div?) here
    }
    $counter++;
}

if ($counter % 5 !== 4) {
    echo '</div>' . PHP_EOL; // close container (div) here, because unclosed
}

Чтобы увидеть его в действии (<div> и </div> заменены соответственно на [ и ]), просто перейдите по ссылке: http://codepad.org/GjMhiX5y

0 голосов
/ 19 октября 2011

другими словами, вы хотите преобразовать одномерный массив в двумерный массив, например так:

$array_one = array("A", "B", "C", "D", "E", "F", "G", "I");
$counter1 = 0;
$counter2 = 0;
foreach($array_one as $e) {
  $array_two[$couter1][$couter2] = $e;
  if($counter2==4) {
    $counter1++;
    $counter2 = 0;
  }
  else {
    $counter2++;
  }
}

или проще:

for($i = 0; $i<count($array_one); $i++)
  $array_two[$i/5][$i%5] = $array_one[$i];
0 голосов
/ 19 октября 2011

Самое быстрое и простое решение

$array = Array(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17);

for($i = 0 ; $i < count($array) ; $i += 5) {
    echo "<div>".join(" | ", array_slice($array, $i, 5))."</div>";
}

цикл: возьмите 5 элементов из массива, поместите в div и соедините их с помощью '|'

Рабочий пример

0 голосов
/ 19 октября 2011
    <?php
    $data = array(1, 2, 3, 4, 5, 6);

    echo '<div>';
    for($i=0;$i<count($data);$i++) {
        if ($i && $i % 5 == 0) {
            echo '</div><div>';
        }
        echo "$data[$i] ";
    }
    echo '</div>';
    ?>
0 голосов
/ 19 октября 2011

Используйте оператор модуля (%), чтобы проверить, делится ли число на другое число.В этом случае $x % 5 == 0 означает if the remainder of $x divided by 5 is equal to 0.

<?php

$data = array("1","2","3","4","5","6","7","8","9","egg");

echo "<div>";
for($x=0; $x<count($data); $x++) {
    echo $data[$x];
    if ($x > 0 && $x % 5 == 0) {
        echo "</div><div>";
    }
}
echo "</div>";

?>

Редактировать: В ответ на ваш комментарий я должен был написать это так:

<?php

$data = array("1","2","3","4","5","6","7","8","9","egg");

echo "<div>";
for($x=1; $x<=count($data); $x++) {
    echo $data[$x-1];
    if ($x % 5 == 0) {
        echo "</div><div>";
    }
}
echo "</div>";

?>

Обратите внимание на изменение объявления цикла for, изменение способа доступа к элементу массива $data и изменение условного внутри цикла.

0 голосов
/ 19 октября 2011

Предупреждение: непроверенный код.Попробуйте это, однако.

$perRow = 4;
$myContentArray = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$total = count($myContentArray);
$maxDivs = 3;

for($i = 0, $c = 0; $i < $total && $c <= $maxDivs; $i += $perRow + 1, $c++)
{
    echo '<div>';
    for($j = $i; $j <= $i + $perRow && $j < $total; $j++)
    {
        echo $myContentArray[$j] . ' ';
    }
    echo '</div>';
}

Это напечатает:

<div>1 2 3 4 5 </div><div>6 7 8 9 10 </div>
0 голосов
/ 19 октября 2011

Псевдокод:

  1. Цикл по массиву со счетчиком
  2. Если счетчик = 0 или равномерно делится на 5, откройте <div>
  3. Печать элемента массива

Примечание: Флаг, определяющий, открыт ли <div>, чтобы проверить, когда закрывать, часто бывает полезен.Сделайте это для шага 2 и после цикла.

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