А хіба current() та end() вже не справляються?

← А хіба current() та end() вже не справляються?

Ashterix

docs: English JsonRpcBundle docs, REST and MCP Bundle sections, package cards

uk/articles/from-tg/php/array-first-last.md новий файл +69 −0

1 + # А хіба current() та end() вже не справляються?
2 +
3 + На одній з персональних консультацій ми з одним з читачів обговорювали [статтю про нововведення в PHP 8.5](https://sensiolabs.com/blog/2025/new-in-php-85), зокрема появу функцій `array_first()` та `array_last()`.
4 +
5 + У нього виникло питання:
6 +
7 + > “А навіщо це потрібно, якщо є current() і end()?”
8 +
9 + І раптом я подумав, що це питання може виникнути не тільки в нього, бо може здатися, що `current()` та `end()` роблять те саме.
10 +
11 + Тому я вирішив коротко розкласти все по поличках.
12 +
13 + ## Що насправді роблять current() та end()
14 +
15 + Функція `current()` справді повертає перший елемент, а `end()` — останній елемент масиву, але тільки після того, як зрушують внутрішній вказівник масиву. Це означає, що:
16 +
17 + ```php
18 + $array = ['a', 'b', 'c', 'd'];
19 +
20 + echo current($array); // 'a'
21 +
22 + echo next($array); // 'b'
23 + echo current($array); // 'b', а не 'a'
24 +
25 + echo end($array); // 'd'
26 + echo current($array); // 'd' а не 'a'
27 + ```
28 +
29 + Тобто функція `current()` повертає не перший елемент масиву, а той, на який вказує вказівник, а `end()` — останній елемент масиву, але при цьому переставляє на нього внутрішній вказівник масиву, що в свою чергу може призвести до непередбачуваних наслідків.
30 +
31 + Концептуальний приклад: ми хочемо вивести всі елементи масиву, якщо останній елемент не "d".
32 +
33 + ```php
34 + $array = ['a', 'b', 'c'];
35 +
36 + if (end($array) !== 'd') { // але вказівник вже перемістився на 'c'
37 + while ($item = current($array)) {
38 + echo $item . PHP_EOL;
39 + next($array);
40 + }
41 + }
42 + ```
43 +
44 + Але на екран виведеться тільки 'c'.
45 +
46 + ## array_first() та array_last() — декларативні та передбачувані
47 +
48 + Нові функції будуть завжди повертати перше або останнє значення без побічних ефектів.
49 +
50 + Вони не змінюють стан вказівника і не залежать від нього:
51 +
52 + ```php
53 + $array = ['a', 'b', 'c'];
54 +
55 + array_first($array); // 'a'
56 + array_last($array); // 'c'
57 +
58 + // Незалежно від вказівника
59 + next($array);
60 + array_first($array); // все ще 'a'
61 + ```
62 +
63 + PHP продовжує розвиватися в бік декларативного і безпечного коду, і ці нові функції — це не "зайве", а ще один крок до меншої кількості багів.
64 +
65 + Якщо помітили у себе в коді `current()` чи `end()` — можливо, час подивитись на них під новим кутом.
66 +
67 + ---
68 +
69 + *Вперше опубліковано в Telegram-каналі [«Створений щоб помирати»](https://t.me/php_while_true/44) 25.06.2025.*