-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtestwork1
More file actions
149 lines (127 loc) · 6.39 KB
/
Copy pathtestwork1
File metadata and controls
149 lines (127 loc) · 6.39 KB
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
1) Нужно написать функцию, которая в качестве аргумента принимала строчку, например
“abcdfg”, а возвращала строчку наоборот, например “gfdbca”.
Решение:
Такая функция уже есть в базовом функционале PHP - strrev. Но я напишу еще пару вариантов
$str="abcdfg";
function revert($str){
$rev_str="";
for($i=strlen($str)-1;$i>=0;$i--)
$rev_str.=$str[$i];
return $rev_str;
}
//если еще поизвращаться, то можно получить такое
function revert($str){
$rev_str=array();
foreach (str_split($str) as $ch)
array_unshift($rev_str,$ch);
return implode("",$rev_str);
}
2) Нужно написать код, который бы выводил (в браузер/в консоль) числа от 1 до 100.
Каждое число на новой строке.
При этом:
● Если число делится на 3, то вместо числа выводить “Три”
● Если число делится на 5, то вместо числа выводить “Пять”
● Если число делится на 3 и 5, то вместо числа выводить “ТриПять”
Решение:
for($i=1;$i<=100;$i++)
{
if ($i%3==0 && $i%5==0)
echo "ТриПять";
elseif ($i%3==0)
echo "Три";
elseif ($i%5==0)
echo "Пять";
else
echo $i;
echo "\r\n";
}
3) Есть сайт платных статей, со своей базой пользователей (customer: id, email), которым
ежедневно на электронную почту отправляются превью одной статьи (article: id, title,
teaser, text). Пользователь имеет возможность перейти по ссылке из письма и купить
полный доступ к статье.
Нужно спроектировать базу данных для сохранения и анализа статистики.
События которые требуется отслеживать:
● Отправка письма
● Открытие письма
● Переход по ссылке из письма
● Покупка статьи
Напишите SQL запрос который создает необходимую структуру данных.
Решение:
CREATE TABLE customer (
id INT unsigned PRIMARY KEY AUTO_INCREMENT,
email varchar(60) NOT NULL
)
CREATE TABLE article (
id INT unsigned PRIMARY KEY AUTO_INCREMENT,
title varchar(100) NOT NULL,
teaser varchar(500),
text TEXT
)
CREATE TABLE stats ( //запись в данной таблице будет свидетельствовать, что письмо было отправленно
id INT unsigned PRIMARY KEY AUTO_INCREMENT,
customer_id INT unsigned NOT NULL,
article_id INT unsigned NOT NULL,
open boolean DEFAULT false,
link boolean DEFAULT false,
buy boolean DEFAULT false
)
4) Исходя из решения задачи номер 3, напишите SQL запросы к БД:
1. Выбрать самых покупающих пользователей по соотношению отправили/купили
2. Выбрать самую популярную статью по покупкам по соотношению отправили/купили
3. Выбрать пользователей, которые открывают письма чаще других
4. Выбрать пользователей, которые никогда не покупали статей
5. Выбрать пользователей, которые купили больше 5 статей
6. Выбрать пользователей, которые купили статьи с id = 3 и 4
SELECT customer.* FROM customer JOIN stats ON customer.id=stats.customer_id WHERE stats.article_id=3 OR stats.article_id=4 GROUP BY customer.id;
7. Выбрать статью, по которой чаще всех переходят по соотношению
отправили/перешли
8. Выбрать статью, которую больше всех купили (всего)
SELECT stats.article_id, COUNT(article_id) as count FROM stats WHERE buy=true GROUP BY article_id ORDER BY count DESC LIMIT 1;
5) Есть код:
class a {
public $subClasses = array();
public function __construct(){
$this->subClasses = func_get_args();
}
}
class b extends a {}
$list = new a(
new a(
new a(
new b(),
new a(
new b(),
new a()
)
),
new b(
new a(
new b (
new a (
new b(),
new b()
),
new a(),
new a(),
new a()
)
)
)
)
);
Требуется написать функцию, которая бы принимала в качестве аргумента переменную
с экземпляром класса a, а в качестве выходного значения возвращала бы количество
экземпляров класса b, которые содержаться в этом аргументе.
Решение:
Рекурсия со статической переменной и без обнуления счетчика после исполнения
function calc(a $a_class) //принимаем только экземпляр класса а
{
static $count=0; //статическая переменная счетчик для хранения вычисления рекурсии
foreach ($a_class->subClasses as $item) //проходим по всему массиву текущего класса
{
if (get_class($item) =="b" ) $count++; //если текущий класс имеет имя b делаем инкремент счетчика
if (is_array($item->subClasses)&&($item instanceof a)) calc($item); //если текущий класс содержит массив и явлается наследником класса а то входим в рекурсию
}
return $count;
}
echo calc($list);