powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Тестовое задание шаблонов
9 сообщений из 9, страница 1 из 1
Тестовое задание шаблонов
    #37152129
Djos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Встречал уже не сколько раз это тестовое задание, хотел по интересоваться как вы его реализуете.

Задание:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
/**
Дан массив «шаблонов». Каждый шаблон имеет следующие параметры: 
"Id" — уникальный числовой идентификатор шаблона
"ParentId" — идентификатор родительского шаблона, если таковой имеется, иначе 0
"Atribut" — атрибут (часть текста) родительского шаблона, которая должна быть заменена на текст данного шаблона
"Text" — текст данного шаблона.

Необходимо написать рекурсивную функцию getTemplate($id), которая по идентификатору шаблона возвращает итоговый шаблон,
полученный последовательным «вложением» дочерних шаблонов в родительские, т.е. заменой атрибута родительского шаблона
на текст дочернего.

На вход процедуры передается НЕ корневой шаблон, а дочерний (4,5,6), ну и 7. 
Соответственно там разное дерево шаблонов строится восходя вверх по родителям.

Пример массива шаблонов: 
*/
$templates= array ( 
	 array ("Id"=> 1 ,"ParentId"=> 0 ,"Atribut"=>"","Text"=>"Корневой шаблон / <%TITLE%>"), 
	 array ("Id"=> 2 ,"ParentId"=> 1 ,"Atribut"=>"<%TITLE%>","Text"=>"Первый подшаблон<br/><%CONTENT%>"), 
	 array ("Id"=> 3 ,"ParentId"=> 1 ,"Atribut"=>"<%TITLE%>","Text"=>"Второй подшаблон<br/><%CONTENT%>"), 
	 array ("Id"=> 4 ,"ParentId"=> 2 ,"Atribut"=>"<%CONTENT%>","Text"=>"<b>Шаблон 4</b>"), 
	 array ("Id"=> 5 ,"ParentId"=> 3 ,"Atribut"=>"<%CONTENT%>","Text"=>"<b>Шаблон 5</b>"), 
	 array ("Id"=> 6 ,"ParentId"=> 2 ,"Atribut"=>"<%CONTENT%>","Text"=>"<b>Шаблон 6</b>"), 
	 array ("Id"=> 7 ,"ParentId"=> 0 ,"Atribut"=>"","Text"=>"Корневой шаблон №2") 
);


Мое решение:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 function  getTemplate($id){
	$templates= array ( 
		 array ("Id"=> 1 ,"ParentId"=> 0 ,"Atribut"=>"","Text"=>"Корневой шаблон / <%TITLE%>"), 
		 array ("Id"=> 2 ,"ParentId"=> 1 ,"Atribut"=>"<%TITLE%>","Text"=>"Первый подшаблон<br/><%CONTENT%>"), 
		 array ("Id"=> 3 ,"ParentId"=> 1 ,"Atribut"=>"<%TITLE%>","Text"=>"Второй подшаблон<br/><%CONTENT%>"), 
		 array ("Id"=> 4 ,"ParentId"=> 2 ,"Atribut"=>"<%CONTENT%>","Text"=>"<b>Шаблон 4</b>"), 
		 array ("Id"=> 5 ,"ParentId"=> 3 ,"Atribut"=>"<%CONTENT%>","Text"=>"<b>Шаблон 5</b>"), 
		 array ("Id"=> 6 ,"ParentId"=> 2 ,"Atribut"=>"<%CONTENT%>","Text"=>"<b>Шаблон 6</b>"), 
		 array ("Id"=> 7 ,"ParentId"=> 0 ,"Atribut"=>"","Text"=>"Корневой шаблон №2") 
	);
	 if (!$templates[$id- 1 ])  return   false ;
	
	$arr=$templates[$id- 1 ];
	 if ($arr['ParentId']){
		$str=getTemplate($arr['ParentId']);
		$str= str_replace ($arr['Atribut'],$arr['Text'],$str);
	} else {
		$str=$arr['Text'];
	}
	 return  $str;
}
 echo  getTemplate( 5 );


Не все берется с воздуха!
...
Рейтинг: 0 / 0
Тестовое задание шаблонов
    #37152148
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
		 array ("Id"=> 1 ,"ParentId"=> 0 ,"Atribut"=>"","Text"=>"Корневой шаблон / <%TITLE%>"), 
		 array ("Id"=> 2 ,"ParentId"=> 1 ,"Atribut"=>"<%TITLE%>","Text"=>"Первый подшаблон<br/><%CONTENT%>"), 
		 array ("Id"=> 3 ,"ParentId"=> 1 ,"Atribut"=>"<%TITLE%>","Text"=>"Второй подшаблон<br/><%CONTENT%>"), 
		 array ("Id"=> 7 ,"ParentId"=> 0 ,"Atribut"=>"","Text"=>"Корневой шаблон №2") 
		 array ("Id"=> 4 ,"ParentId"=> 2 ,"Atribut"=>"<%CONTENT%>","Text"=>"<b>Шаблон 4</b>"), 
		 array ("Id"=> 5 ,"ParentId"=> 3 ,"Atribut"=>"<%CONTENT%>","Text"=>"<b>Шаблон 5</b>"), 
		 array ("Id"=> 6 ,"ParentId"=> 2 ,"Atribut"=>"<%CONTENT%>","Text"=>"<b>Шаблон 6</b>"), 
А так ваша функция уже работать не будет.
...
Рейтинг: 0 / 0
Тестовое задание шаблонов
    #37152185
Djos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да не будет.
Вот и хотел узнать как другие ее реализуют.
Можно через foreach, но думал возможно есть и другое решение.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
 function  getTemplate($id){
	$templates= array ( 
		 array ("Id"=> 1 ,"ParentId"=> 0 ,"Atribut"=>"","Text"=>"Корневой шаблон / <%TITLE%>"), 
		 array ("Id"=> 2 ,"ParentId"=> 1 ,"Atribut"=>"<%TITLE%>","Text"=>"Первый подшаблон<br/><%CONTENT%>"), 
		 array ("Id"=> 3 ,"ParentId"=> 1 ,"Atribut"=>"<%TITLE%>","Text"=>"Второй подшаблон<br/><%CONTENT%>"), 
		 array ("Id"=> 4 ,"ParentId"=> 2 ,"Atribut"=>"<%CONTENT%>","Text"=>"<b>Шаблон 4</b>"), 
		 array ("Id"=> 5 ,"ParentId"=> 3 ,"Atribut"=>"<%CONTENT%>","Text"=>"<b>Шаблон 5</b>"), 
		 array ("Id"=> 6 ,"ParentId"=> 2 ,"Atribut"=>"<%CONTENT%>","Text"=>"<b>Шаблон 6</b>"), 
		 array ("Id"=> 7 ,"ParentId"=> 0 ,"Atribut"=>"","Text"=>"Корневой шаблон №2") 
	);

	 foreach ($templates  as  $arr) 
		 if ($arr['Id']==$id){
			$find= true ;
			 break ;
		}

	 if (!find)  return   false ;

	 if ($arr['ParentId']){
		$str=getTemplate($arr['ParentId']);
		$str= str_replace ($arr['Atribut'],$arr['Text'],$str);
	} else {
		$str=$arr['Text'];
	}
	 return  $str;
}
...
Рейтинг: 0 / 0
Тестовое задание шаблонов
    #37152198
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К тому же у вас там куча одинаковых экземпляров массива наплодиться может.

Сегодня что-то думать уже не охота, может как-то так.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
$templates =  array (
     array ("Id"=> 1 ,"ParentId"=> 0 ,"Atribut"=>"","Text"=>"Корневой шаблон / <%TITLE%>"),
     array ("Id"=> 2 ,"ParentId"=> 1 ,"Atribut"=>"<%TITLE%>","Text"=>"Первый подшаблон<br/><%CONTENT%>"),
     array ("Id"=> 3 ,"ParentId"=> 1 ,"Atribut"=>"<%TITLE%>","Text"=>"Второй подшаблон<br/><%CONTENT%>"),
     array ("Id"=> 4 ,"ParentId"=> 2 ,"Atribut"=>"<%CONTENT%>","Text"=>"<b>Шаблон 4</b>"),
     array ("Id"=> 5 ,"ParentId"=> 3 ,"Atribut"=>"<%CONTENT%>","Text"=>"<b>Шаблон 5</b>"),
     array ("Id"=> 6 ,"ParentId"=> 2 ,"Atribut"=>"<%CONTENT%>","Text"=>"<b>Шаблон 6</b>"),
     array ("Id"=> 7 ,"ParentId"=> 0 ,"Atribut"=>"","Text"=>"Корневой шаблон №2")
);


 function  getTemplate($id, &$templates){

     foreach ($templates  as  $template)
    {
         if ($template['Id'] == $id)
        {
             if ($template['ParentId'] !==  0 )
            {
                $str = getTemplate($template['ParentId'], $templates);
                 return   str_replace ($template['Atribut'], $template['Text'], $str);
            }
             return  $template['Text'];
        }
    }

     return   false ;
}
 echo  getTemplate( 5 , $templates);
...
Рейтинг: 0 / 0
Тестовое задание шаблонов
    #37152200
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну там break еще конечно не помешает)
...
Рейтинг: 0 / 0
Тестовое задание шаблонов
    #37152226
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
*не нужен там брейк
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Тестовое задание шаблонов
    #39250145
mikes678
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторif(!$templates[$id-1]) return false;

Помогите плиз ламмеру. Почему выражение используется [$id-1]?
...
Рейтинг: 0 / 0
Тестовое задание шаблонов
    #39250315
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikes678авторif(!$templates[$id-1]) return false;

Помогите плиз ламмеру. Почему выражение используется [$id-1]?

Оо . Разве не очевидно?
Если по простому, то PHP нумерует элементы массива с нуля.
Если по сложному, то индекс массива - это не его номер, а его смещение от начала массива. Соответственно первый элемент имеет индекс 0 (без смещения, находится в начале массива), второй - 1, третий - 2 и т.д.
...
Рейтинг: 0 / 0
Тестовое задание шаблонов
    #39250337
mikes678
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо) большоес)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Тестовое задание шаблонов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]