I think you are looking for an algorithm similar to this. It will add an open <div>
at 1
and close <div>
at 3
. You would have to accommodate for numbers that leave a remainder:
// Set the start at 1
$i = 1;
foreach ($sql as $row){
// If the loop hits 1, add <div>
if($i == 1)
echo '<div>'.PHP_EOL;
echo $id = "\t<li>".$row["post_id"].'</li>'.PHP_EOL;
// If the loop hits 3, add </div>
if($i == 3) {
echo '</div>'.PHP_EOL;
// Reset the counter
$i = 0;
}
// Increment up
$i++;
}
With random numbers will give you something like:
<div>
<li>309781723</li>
<li>1591425966</li>
<li>1922824365</li>
</div>
<div>
<li>1861766038</li>
<li>2065624155</li>
<li>504061231</li>
</div>
<div>
<li>143488299</li>
<li>806735480</li>
<li>605627018</li>
</div>
<div>
<li>1305718337</li>
<li>2080669131</li>
<li>314748482</li>
</div>
Here is another example: Displaying data from arrays in a dynamic table PHP
You can also do an array_chunk()
similar to this. You don't need any calculations to accommodate for remainders in this scenario:
// Split into sets of 3
$arr = array_chunk($sql,3);
$a = 0;
// You could probably do an array_map() but I am not experienced enough
// with array_map() to do it efficiently...or even at all, to be perfectly honest
foreach($arr as $row) {
for($i = 0; $i < count($row); $i++)
$new[$a][] = $row[$i]['post_id'];
// Assemble the rows via implode
$nRow[] = "\t<li>".implode("</li>".PHP_EOL."\t<li>",$new[$a])."</li>".PHP_EOL;
$a++;
}
// Implode with <div> wrappers
echo "<div>".PHP_EOL.implode("</div>".PHP_EOL."<div>".PHP_EOL,$nRow)."</div>";