PHP. Реальная практика в полях №1 . "Вывод в Ёлочку"

Задача: Вывести любое слово в "ёлочку" . Например, cлово "WORLD!!!" вывести нужно вот так :
W
OR
LD!
!!

Как можно решить задачу :

Представить слово в виде массива.
С помощью двух циклов сделать следующее :
На первой строке вывести элемент массива с номером [0]
На второй строке [1][2]
На третьей строке [3][4][5]
И т.д.
И оборвать выполнение кода , когда количество символов закончиться.

Вот код :

<?php


 
	
// Вывод в ёлочку : 


// Присваиваем переменной $a строку "ABCDEFGHIJKLMNOPQRSTUVWXYZ" : 
$a="ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;
// Присваиваем переменной $arr  массив , который мы создали из строки с помощью функции  str_split ()  : 
$arr = str_split ($a) ;
// Присваиваем начальные значения переменным  :
$j=0;
$e=0;
// Используем два цикла первый внешний цикл while нужен для контроля вывода символов ,
// второй for  отвечает за вывод в строку   :
while ( $j < count($arr) ) // Пока выражение истинно делаем цикл 
{
	 for ( $k = 0;  $k <= $j ; $k++ ) // Выводим в строку значения символов 
		{
			echo $arr[$e]; 
			$e++;
		}
	$j++ ;
	echo "<BR>";
	// Если вы вовремя не оборвёте выполнение цикла , то вылезет ошибка : Undefined offset: 26 in C:\www\test\index.php on line 46
	// Это потому, что выводится пустой массив 
	// Обрываем выполнение циклов
	
	if ($e > count($arr) )
		{
			break   ;
		}
}

Cсылка : http://fkn.ktu10.com/?q=node/7179
Здесь мы будем решать эти задачи средствами PHP . Решение пишется в виде конкретной функции или конкретного кода решения задачи .

+ Задача № 1. Вывести на экран сообщение «Hello World!»
Решение :

echo "Hello World!" ;

# echo выводит любую написанную информацию в кавычках
Задача № 2. Вывести на экран три числа в порядке, обратном вводу
Решение :

$a[1]=1;
$a[2]=2;
$a[3]=100;
echo $a[3]," ",$a[2], " ",$a[1] ;

+ Задача № 3. Вывести на экран квадрат введенного числа
Решение :

$a=3;
echo pow($a,2);  # возводим с помощью мат.функции в степень 2 (может быть любая степень)

+ Задача № 4. Получить реверсную запись трехзначного числа
Решение :

$a= 347 ; 
$c = $a % 10 ;
$d = ($a-$c)/ 10;
$e=$d % 10 ;
$f=($d-$e) /10;
echo $c*100+$e*10+$f ;

Задача № 5. Посчитать количество единичных битов числа
Условные операторы .
http://fkn.ktu10.com/?q=node/7189

fgh,
в приведённом здесь решении задачи про вывод в "ёлочку" есть недочёты.

Пусть \$a == "AB". Тогда count(\$arr) == 2.
В массиве \$arr есть только элементы \$arr[0] и \$arr[1].
\$j == 0 и \$e == 0.
Начинаем выполнять цикл while.
\$j меньше count(\$arr), так как $0 \lt 2$.
Далее цикл for выводит \$arr[0].
Теперь \$e == 1.
Далее выполняется \$j++ ; Теперь \$j == 1.
Переходим на новую строку.
(\$e > count(\$arr) ) является ложью, и из цикла мы не выходим.
\$j меньше count(\$arr) , и начинается следующая итерация цикла while.
Теперь \$j == 1, поэтому цикл for должен вывести \$arr[1] и \$arr[2].

Можно исправить программу, добавив в условия обоих циклов

( $e < count($arr) )
<?php   
#!/usr/bin/php
// Вывод в ёлочку : 
  
// Присваиваем переменной $a строку "ABCDEFGHIJKLMNOPQRSTUVWXYZ" : 
$a="ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;
// Присваиваем переменной $arr  массив , который мы создали из строки с помощью функции  str_split ()  : 
$arr = str_split ($a) ;
// Присваиваем начальные значения переменным  :
$j=0;
$e=0;
// Используем два цикла первый внешний цикл while нужен для контроля вывода символов ,
// второй for  отвечает за вывод в строку   :
while ( $e < count($arr) ) // Пока выражение истинно делаем цикл 
{
     for ( $k = 0; ( $k <= $j ) and ( $e < count($arr) ) ; $k++ ) // Выводим в строку значения символов 
        {
            echo $arr[$e]; 
            $e++;
        }
    $j++ ;
    echo "<BR>";
}
?>
vedro-compota's picture

условие

and ( $e < count($arr)

во внутреннем цикле является лишним.
Объясните почему.

_____________
матфак вгу и остальная классика =)

Если Вы уберёте условие

	
and ( $e < count($arr)

то скрипт, конечно, будет выполнен, но с замечаниями:
PHP Notice: Undefined offset: 26 in /home/vic/Desktop/gip.php on line 19
PHP Notice: Undefined offset: 27 in /home/vic/Desktop/gip.php on line 19

Может случиться так, что при выводе последнего ряда "ёлочки" длины j
в строке для вывода останется меньше символов, чем j, а цикл for будет выводить
все j символов, даже если в массиве \$arr их осталось меньше, чем j.

vedro-compota's picture

math2, спасибо за замечание!
=> всё хорошо, а вот моя "оптимизация" оказывается не охватывает указанный вами случай)

_____________
матфак вгу и остальная классика =)

vedro-compota's picture

http://fkn.ktu10.com/?q=node/add/forum/133

это битая ссылка - исправьте. она указывает на скрипт создания нового топика.

_____________
матфак вгу и остальная классика =)