Skip to content

Commit 46696a5

Browse files
committed
refs #119 Added init Collection
1 parent 86a46fb commit 46696a5

File tree

5 files changed

+210
-0
lines changed

5 files changed

+210
-0
lines changed

routes/web.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
Route::view('/library/upgrade', 'library.upgrade')->name('library.upgrade');
5454
Route::view('/library/security', 'library.security')->name('library.security');
5555
Route::view('/library/how-to-ask', 'library.how-to-ask')->name('library.how-to-ask');
56+
Route::view('/library/collection', 'library.collection')->name('library.collection');
5657

5758
/*
5859
|--------------------------------------------------------------------------

storage/library/collection/basics.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
---
2+
title: "Основы"
3+
description: "Понимание основных принципов работы с коллекциями"
4+
---
5+
6+
Использование коллекций не является обязательным элементом, они не добавляют новую функциональность в PHP, но
7+
предоставляют удобный интерфейс для работы с массивами. При написании кода с использованием коллекций вы будете писать
8+
более выразительный код упрощая множество операций с данными, таких как фильтрация, сортировка, слияние и трансформация
9+
и т.д.
10+
11+
> [!NOTE]
12+
> Результаты запросов `Eloquent` всегда возвращаются как экземпляры `Collection`.
13+
14+
Когда вы пишете код в императивном стиле, вы указываете, как выполнить задачу, в то время как декларативный стиль
15+
позволяет описывать что вы хотите достичь, без явного указания шагов выполнения. Использование коллекций способствует
16+
более декларативному подходу к программированию, где вы объявляете операции над данных, а не реализуете их самостоятельно.
17+
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
---
2+
title: "Не используйте примитивы"
3+
description: "Что-то написать"
4+
---
5+
6+
Помимо явной цепочки вызовов, мы можем передавать промежуточные значения для дальнейшей обработки.
7+
Например, в одном методе мы можем сформировать коллекцию активных пользователей, а в другом продолжить высокоуровневую обработку:
8+
9+
```php
10+
function getActiveUsers(): array
11+
{
12+
// ...
13+
14+
$activeUsers = array_filter($activeUsers, function (User $user) {
15+
return $user->isActive();
16+
});
17+
18+
$activeUsers = array_filter($activeUsers, function (User $user) {
19+
return !$user->isAdmin();
20+
});
21+
22+
usort($activeUsers, function (User $a, User $b) {
23+
return $a->created_at <=> $b->created_at;
24+
});
25+
26+
retrun $activeUsers;
27+
}
28+
29+
30+
$activeUsers = getActiveUsers();
31+
32+
// Вычисление среднего возраста активных пользователей
33+
$totalAge = 0;
34+
foreach ($activeUsers as $user) {
35+
$totalAge += $user->age;
36+
}
37+
$averageAge = $totalAge / count($activeUsers);
38+
39+
// Формирование списка электронных адресов активных пользователей
40+
$emailList = [];
41+
foreach ($activeUsers as $user) {
42+
$emailList[] = $user->email;
43+
}
44+
```
45+
46+
```php
47+
// Хорошо ✅
48+
function getActiveUsers(): Collection
49+
{
50+
// ...
51+
52+
return $users
53+
->filter(function (User $user) {
54+
return $user->isActive();
55+
})
56+
->filter(function (User $user) {
57+
return !$user->isAdmin();
58+
})
59+
->sortBy('created_at');
60+
}
61+
62+
63+
64+
$activeUsers = getActiveUsers();
65+
66+
// Вычисление среднего возраста активных пользователей
67+
$averageAge = $activeUsers->avg('age');
68+
69+
// Формирование списка электронных адресов активных пользователей
70+
$emailList = $activeUsers->pluck('email');
71+
```

storage/library/collection/foreach.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
---
2+
title: "Не используйте циклы"
3+
description: "Замените циклов на методы коллекций при обработке данных."
4+
---
5+
6+
Циклы, такие как `foreach` и `for`, широко используются для обработки данных в PHP.
7+
Однако, при использовании циклов код может стать трудночитаемым, запутанным, а следовательно подверженным ошибкам.
8+
Рассмотрим следующий распространённый пример:
9+
10+
```php
11+
// Плохо ❌
12+
$activeUsers = [];
13+
14+
foreach ($users as $user) {
15+
if ($user->isActive()) {
16+
$activeUsers[] = $user;
17+
}
18+
}
19+
```
20+
21+
Здесь мы используем цикл `foreach` для фильтрации активных пользователей.
22+
Этот подход требует создания временного массива и ведет к увеличению объема кода.
23+
24+
При использовании коллекций доступно множество методов, таких как `filter`, `map`, `reduce`, которые позволяют заменить типичные циклы на более элегантные и понятные конструкции. Перепишем предыдущий пример, используя метод `filter`:
25+
26+
```php
27+
// Хорошо ✅
28+
$activeUsers = $users->filter(function (User $user) {
29+
return $user->isActive();
30+
});
31+
```
32+
33+
Этот код короче, проще читается и не требует создания временного массива.
34+
Метод `filter` применяет заданное условие к каждому элементу коллекции, возвращая только те, которые соответствуют критерию.
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
---
2+
title: "Думай поэтапно"
3+
description: "Замените циклов на методы коллекций при обработке данных."
4+
---
5+
6+
В программировании часто возникают задачи, требующие последовательного выполнения нескольких шагов для достижения
7+
конечного результата. Методология "Думая поэтапно" помогает справиться с такими задачами, разбивая их на более мелкие,
8+
управляемые этапы. Давайте рассмотрим, как мы можем использовать методы коллекций в PHP для реализации этого подхода.
9+
10+
Давайте снова вернёмся к примеру с фильтрацией активных пользователей:
11+
12+
```php
13+
// Плохо ❌
14+
$activeUsers = [];
15+
16+
foreach ($users as $user) {
17+
if ($user->isActive()) {
18+
$activeUsers[] = $user;
19+
}
20+
}
21+
```
22+
23+
Теперь нам нужно добавить ещё один шаг: убрать администраторов из списка активных пользователей и мы не хотим
24+
использовать массивы:
25+
26+
```php
27+
// Лучше, но не идеально ❌
28+
$activeUsers = array_filter($activeUsers, function (User $user) {
29+
return $user->isActive();
30+
});
31+
32+
$activeUsers = array_filter($activeUsers, function (User $user) {
33+
return !$user->isAdmin();
34+
});
35+
```
36+
37+
Нам пришлось объявить переменную `$activeUsers` дважды, но это не самое худшее.
38+
39+
При использовании коллекции каждый вызов метода, это отдельный шаг, который можно легко прочитать и понять:
40+
41+
```php
42+
// Хорошо ✅
43+
$activeUsers = $users
44+
->filter(function (User $user) {
45+
return $user->isActive();
46+
})
47+
->filter(function (User $user) {
48+
return !$user->isAdmin();
49+
});
50+
```
51+
52+
53+
Теперь введём ещё одно условие, нам нужно отсортировать пользователей по дате регистрации:
54+
55+
```php
56+
// Лучше, но не идеально ❌
57+
$activeUsers = array_filter($activeUsers, function (User $user) {
58+
return $user->isActive();
59+
});
60+
61+
$activeUsers = array_filter($activeUsers, function (User $user) {
62+
return !$user->isAdmin();
63+
});
64+
65+
usort($activeUsers, function (User $a, User $b) {
66+
return $a->created_at <=> $b->created_at;
67+
});
68+
```
69+
70+
Используя методы коллекций, мы можем добавить сортировку в цепочку методов:
71+
72+
```php
73+
// Хорошо ✅
74+
$activeUsers = $users
75+
->filter(function (User $user) {
76+
return $user->isActive();
77+
})
78+
->filter(function (User $user) {
79+
return !$user->isAdmin();
80+
})
81+
->sortBy('created_at');
82+
```
83+
84+
85+
Использование методов коллекций позволяет нам более явно выразить наши намерения при обработке данных, делая код более
86+
структурированным и легким для понимания.
87+

0 commit comments

Comments
 (0)