Мне нужна помощь в течение цикла

Привет всем, ребята, на самом деле я создаю код для PHP.

что я хочу получить для цикла. что-то будет так

*
**
***
****
*****
****
***
**
*

эту вещь, которую я хочу создать прямо сейчас, у меня есть этот код.

<?php

$i = 1;
$end = 5;
$star = "*";

for($i; $i <= $end; $i++){
for($b=1; $b <= $i; $b++){
echo $star;
}if($i == $end){
for($c=1; $c <= $end; $c++ ){
for($d=i; $d >= 2; $d--){
echo $star;
}
echo "<br>";
}
}
};

?>

и работает нормально

*
**
***
****
*****

но тогда мне нужен обратный цикл сначала 4, затем 3, затем 2, затем 1 ….. поэтому, пожалуйста, помогите мне, где я ошибаюсь, спасибо за вашу помощь ..

0

Решение

Используя один for цикл:

$end = 5;
$out = array();

for ($i=0;$i<$end;++$i)
{
$out[] = str_repeat('*', $i+1);
}
echo implode(PHP_EOL, $out).PHP_EOL;
array_pop($out);
$out = array_reverse($out);//remove last ****** <-- only one line with 5 stars
echo implode(PHP_EOL, $out).PHP_EOL;

замещать PHP_EOL с <br> если вы хотите, но это наименее зацикленный способ написать этот код, я могу придумать

0

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

Можно с помощью вложенных for петля. Пример:

$n = 5;
for($i = 1; $i <= $n; $i++){
for($j = 1; $j <= $i; $j++){
echo '*';
}
echo '<br />';
}
for($i = $n-1; $i >= 1; $i--){
for($j = $i; $j >= 1; $j--){
echo '*';
}
echo '<br />';
}

Еще одна техника с использованием array_fill(), array_map(), array_reverse()

$n = 5; $arr = array();
for($i = 1; $i <= $n; $i++){
$arr[] = array_fill(0, $i, '*');
}
array_map(function($v){echo join('', $v) . '</br>';},$arr);
unset($arr[count($arr) - 1]); //remove last index value
array_map(function($v){echo join('', $v) . '</br>';},array_reverse($arr));
1

<?php
for($i=0;$i<=6;$i++){
for($k=6;$k>=$i;$k--){
echo " &nbsp;";
}
for($j=1;$j<=$i;$j++){
echo "* &nbsp;";
}
echo "<br>";
}
for($i=5;$i>=1;$i--){
for($k=6;$k>=$i;$k--){
echo " &nbsp;";
}
for($j=1;$j<=$i;$j++){
echo "* &nbsp;";
}
echo "<br>";
}
?>
0

Это может быть достигнуто только с 2 для петель.

$offset = 1;
for ($i = 1; $i > 0; $i += $offset)
{
for($j = 1; $j <= $i; $j++){
echo '*';
}
echo '<br />';

if ($i === 5)
$offset = -1;
}
0
 <?php

$i = 1;
$end = 5;
$star = "*";

for($i; $i <= $end; $i++){
for($b=1; $b <= $i; $b++){
echo $star;
}

};
for($c=$send; $c>=2; $c-- ){
for($d=$end; $d >= 2; $d--){
echo $star;
}
echo "<br>";
};

?>
0

Просто для удовольствия. Попробуй это:

$stars = 1;
for ($i = 0; $i < 9; $i++) {
for ($s = 1; $s <= $stars; $s++) {
echo "*";
}
echo "\n";

$stars += ($i<4)?1:-1;
}

И, для еще большего удовольствия, один с одним for цикл:

$stars = 0;
$starctr = 0;
for ($i = 0; $i < 25; $i++) {
echo "*";

if ($stars == $starctr) {
echo "\n";

$stars += ($i<14)?1:-1;
$starctr = 0;
} else {
$starctr++;
}
}
0

Вот рекурсивная попытка:

function ladder($n, $counter=1, &$acc=array())
{
if ($counter == ($n*2)) {
return implode($acc);
}

if ($counter <= $n) {
$acc[$counter] = str_repeat('*', $counter) . "\n";
$counter++;
}

if ($counter > $n) {
$diff = (int) $n-$counter;
$acc[$counter] = str_repeat('*', $n+$diff) . "\n";
$counter++;
}

return ladder($n, $counter, $acc);
}

print_r(ladder(5));
0