Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /**
- * https://t.me/yii3ru/63240
- *
- * Почему не стоит финализировать ArrayHelper
- * https://github.com/yiisoft/arrays/blob/edec11c95cbc3ee5b6b1b9739a7405a5a325b731/src/ArrayHelper.php
- */
- namespace app\commands;
- use yii\console\Controller;
- use yii\helpers\ArrayHelper as BaseArrayHelper;
- class ExtnArrayHelper extends BaseArrayHelper
- {
- public static function getColumnByPriority(array $array, array $columnNames, $keepKeys = true): array
- {
- return self::getColumn(
- $array,
- function ($element) use ($columnNames) {
- foreach ($columnNames as $column) {
- if ($value = self::getValue($element, $column)) {
- return $value;
- }
- }
- return null;
- },
- $keepKeys
- );
- }
- }
- class OrphArrayHelper
- {
- public static function columnByPriority(...$columnNames): \Closure
- {
- return function ($element) use ($columnNames) {
- foreach ($columnNames as $column) {
- if ($value = BaseArrayHelper::getValue($element, $column)) {
- return $value;
- }
- }
- return null;
- };
- }
- public static function getColumnByPriority(array $array, array $name, bool $keepKeys = true): array
- {
- return BaseArrayHelper::getColumn($array, self::columnByPriority(...$name), $keepKeys);
- }
- }
- /**
- * @method getColumn($array, $name, $keepKeys = true)
- */
- class TrueArrayHelper
- {
- public static function __callStatic($name, $arguments)
- {
- if (method_exists(BaseArrayHelper::class, $name)) {
- return BaseArrayHelper::$name(...$arguments);
- }
- throw new \Exception("Static method $name not found.");
- }
- private static function columnByPriority(...$columnNames): \Closure
- {
- return function ($element) use ($columnNames) {
- foreach ($columnNames as $column) {
- if ($value = BaseArrayHelper::getValue($element, $column)) {
- return $value;
- }
- }
- return null;
- };
- }
- public static function getColumnByPriority(array $array, array $name, bool $keepKeys = true): array
- {
- return BaseArrayHelper::getColumn($array, self::columnByPriority(...$name), $keepKeys);
- }
- }
- class DebugController extends Controller
- {
- public function actionIndex()
- {
- # Пусть есть исходный массив
- $input = [
- ['english' => 'First', 'russian' => 'Первый', 'deutsch' => 'Zuerst'],
- ['russian' => 'Второй'],
- ['russian' => 'Третий', 'deutsch' => 'Dritter'],
- [],
- ];
- # Пусть необходимо получить 2 результата
- $outputFirstGood = [
- 'Zuerst',
- null,
- 'Dritter',
- null
- ];
- $outputSecondGood = [
- 'First',
- 'Второй',
- 'Dritter',
- null
- ];
- # Пример решения в Yii2 через наследование.
- #
- # Лаконично, через наследование, где 1 новый класс с 1 новой функцией (или несколькими, если есть еще необходимость).
- # Где разработчик всегда знает что для решения задач проекта необходимо использовать ExtnArrayHelper
- # Ну или расширять его по мере необходимости 1 раз в несколько месяцев
- $out_1 = ExtnArrayHelper::getColumn($input, 'deutsch');
- $out_2 = ExtnArrayHelper::getColumnByPriority($input, ['english', 'deutsch', 'russian']);
- # Длина строки 98
- # Примеры решения если от BaseArrayHelper нельзя наследовать
- #
- # Получение только немецкого языка будет происходить стандартно через BaseArrayHelper
- $yi311 = BaseArrayHelper::getColumn($input, 'deutsch');
- #
- # А вот получение приоритетной выборки можно сделать тремя разными способами
- #
- #
- # 1) Через 1 новый класс c одной новой функцией, возвращающей \Closure
- # нужную только для того что-бы результат её работы
- # был вставлен во второй параметр BaseArrayHelper::getColumn что на мой взляд излишне усложнено.
- # Всем разработчикам нужно будет помнить что для решения задачи приоритетного получения колонки,
- # при отсутствии нужной, нужную \Closure для второго параметра BaseArrayHelper::getColumn
- # надо брать из другого класса OrphArrayHelper
- # Дополенение:
- # Например, новые разработчики, ранее знакомые с Yii будут знать про BaseArrayHelper::getColumn,
- # и станут еспользовать его при повторном решении этой простой задачи,
- # и я очень сомневаюсь что они будут искать / найдут
- # OrphArrayHelper::anyColumn для того чтобы вставить результат её работы
- # во второй параметр BaseArrayHelper::getColumn
- # они скорее всего напишут что-то своё и всегда с наибольшей вероятностью что с ошибкой
- $yi321 = BaseArrayHelper::getColumn($input, OrphArrayHelper::columnByPriority('english', 'deutsch', 'russian'));
- # Длина строки 121
- #
- #
- # 2) Использовать OrphArrayHelper::getColumnByPriority как обёртку над BaseArrayHelper
- $yi322 = OrphArrayHelper::getColumnByPriority($input, ['english', 'deutsch', 'russian']);
- # Длина строки 98. Как и раньше, но нужно держать в памяти что для одной задачи надо использовать
- # BaseArrayHelper а для другой OrphArrayHelper, хотя они очень близки по смыслу.
- # Что не решает проблему описанную в дополенении.
- #
- #
- # 3) Извернуться через магию чтобы обойти final =)
- $yi323 = TrueArrayHelper::getColumnByPriority($input, ['english', 'deutsch', 'russian']);
- # Длина строки 98.
- $yi312 = TrueArrayHelper::getColumn($input, 'deutsch');
- # Решит проблему дополнения, но магия не лучший вариант + необходимо описать все методы BaseArrayHelper в phpDoc =)))
- #
- #
- # P.S. Програмисты ленивые. А final, на мой взгляд,
- # в классе https://github.com/yiisoft/arrays/blob/edec11c95cbc3ee5b6b1b9739a7405a5a325b731/src/ArrayHelper.php
- # излишний и усложняющий разработку там где это не надо, без профита.
- #
- #
- # P.S.S.
- # BaseArrayHelper (Yii ArrayHelper finalized in future / Yii3),
- # OrphArrayHelper (Orphan),
- # TrueArrayHelper (Very Funny Class),
- # ExtnArrayHelper (Extended)
- # названия классов равной длины используются для наглядности для демонстрации проблемы в одном файле.
- # В реальных условиях я предпочитаю использовать только \app\Helpers\ArrayHelper::class унаследованный от \yii\helpers\ArrayHelper
- # но возможно сообщество со мной не согласится
- if (
- $outputFirstGood === $out_1
- && $outputFirstGood === $yi311
- && $outputFirstGood === $yi312
- ) {
- print_r($outputFirstGood);
- }
- /**
- * Array
- * (
- * [0] => Zuerst
- * [1] =>
- * [2] => Dritter
- * [3] =>
- * )
- */
- if (
- $outputSecondGood === $out_2
- && $outputSecondGood === $yi321
- && $outputSecondGood === $yi322
- && $outputSecondGood === $yi323
- ) {
- print_r($outputSecondGood);
- }
- /**
- * Array
- * (
- * [0] => First
- * [1] => Второй
- * [2] => Dritter
- * [3] =>
- * )
- */
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement