{"id":16409857,"url":"https://github.com/Vasiliy-Makogon/PHP-Collection","last_synced_at":"2025-04-22T12:34:56.958Z","repository":{"id":198121738,"uuid":"154514243","full_name":"Vasiliy-Makogon/Cover","owner":"Vasiliy-Makogon","description":"Cover - библиотека для удобной и гибкой работы с массивами в объектно-ориентированном представлении.","archived":false,"fork":false,"pushed_at":"2023-12-18T11:56:02.000Z","size":24,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-10-12T06:22:17.166Z","etag":null,"topics":["array-object","array-wrapper","arrayobject","cover-array","php-array","php-array-cover","php-array-object","php-array-wrapper","php-collection"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Vasiliy-Makogon.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-10-24T14:19:30.000Z","updated_at":"2023-10-18T14:04:20.000Z","dependencies_parsed_at":"2023-10-04T13:48:51.505Z","dependency_job_id":"09acbbb1-5c1b-4c9e-b774-dbf2ecd347f5","html_url":"https://github.com/Vasiliy-Makogon/Cover","commit_stats":null,"previous_names":["vasiliy-makogon/cover"],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vasiliy-Makogon%2FCover","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vasiliy-Makogon%2FCover/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vasiliy-Makogon%2FCover/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vasiliy-Makogon%2FCover/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Vasiliy-Makogon","download_url":"https://codeload.github.com/Vasiliy-Makogon/Cover/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223896873,"owners_count":17221463,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["array-object","array-wrapper","arrayobject","cover-array","php-array","php-array-cover","php-array-object","php-array-wrapper","php-collection"],"created_at":"2024-10-11T06:21:44.500Z","updated_at":"2025-04-22T12:34:56.945Z","avatar_url":"https://github.com/Vasiliy-Makogon.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Cover Array](logo.jpg)\n\n# Объектный массив на PHP (PHP-коллекция)\n\nНабор классов для удобной и гибкой работы с массивами в объектно-ориентированном\nпредставлении. Фактически, это \"объектный массив\", которого так не хватает в PHP.\n\n## Требования\n\nPHP \u003e= 8.0\n\n## Установка\n\n```\ncomposer require krugozor/cover\n```\n\n# Документация\n\n## Введение\n\nБазовый класс называется `CoverArray`.\nВы можете создать класс, наследуемый от `CoverArray` или использовать `CoverArray` без наследования.\n\nВ данной документации, как и в unit-тестах, используется тип данных `NewTypeArray`,\nнаследуемый от `CoverArray`:\n\n```php\nclass NewTypeArray extends CoverArray {}\n```\n\nЭто сделано для того, что бы продемонстрировать гибкость данного решения.\nОбъектов, производных от `CoverArray`, в вашей программе может быть много, они могут отличаться\nна концептуальном уровне и содержать в себе разную логику работы с данными.\n\nНапример, объекты класса `CoverArray` можно использовать просто как \"объектный массив\"\nдля замещения стандартного `array` в повседневной работе,\nв свою очередь любой другой тип, производный от `CoverArray`, может служить, например, неким подобием DTO\nили попросту быть независимым типом данных для предотвращения \"выстрела в ногу\":\n\n```php\nfunction foo(NewTypeArray $cover) {}\n```\n\n## Инициализация\n\n```php\nclass NewTypeArray extends CoverArray {}\n\n$cover = new NewTypeArray([\n    'firstName' =\u003e 'Vasiliy',\n    'lastName' =\u003e 'Ivanov',\n    'languages' =\u003e [\n        'backend' =\u003e ['PHP', 'MySql'],\n        'frontend' =\u003e ['HTML', 'CSS1', 'JavaScript', 'CSS2', 'CSS3']\n    ],\n]);\n\nvar_dump($cover);\n```\n\nРезультат:\n\n```\nobject(NewTypeArray)#2 (1) {\n  [\"data\":protected]=\u003e\n  array(3) {\n    [\"firstName\"]=\u003e\n    string(7) \"Vasiliy\"\n    [\"lastName\"]=\u003e\n    string(6) \"Ivanov\"\n    [\"languages\"]=\u003e\n    object(NewTypeArray)#4 (1) {\n      [\"data\":protected]=\u003e\n      array(2) {\n        [\"backend\"]=\u003e\n        object(NewTypeArray)#5 (1) {\n          [\"data\":protected]=\u003e\n          array(2) {\n            [0]=\u003e\n            string(3) \"PHP\"\n            [1]=\u003e\n            string(5) \"MySql\"\n          }\n        }\n        [\"frontend\"]=\u003e\n        object(NewTypeArray)#6 (1) {\n          [\"data\":protected]=\u003e\n          array(5) {\n            [0]=\u003e\n            string(4) \"HTML\"\n            [1]=\u003e\n            string(4) \"CSS1\"\n            [2]=\u003e\n            string(10) \"JavaScript\"\n            [3]=\u003e\n            string(4) \"CSS2\"\n            [4]=\u003e\n            string(4) \"CSS3\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\nКак видно, все переданные в конструктор массивы рекурсивно преобразовались в объекты типа `NewTypeArray`.\nЭто поведение гарантирует, что **любой массив, попадающий в хранилище, получит \"обложку\" в виде\nобъекта того класса, который его аккумулирует**.\n\nДанные всех созданных объектов аккуратно сложились в protected-свойство `CoverArray::$data`, что обеспечивает инкапсуляцию\nданных, а функционал базового класса предоставляет безграничную возможность манипуляций над этими данными!\n\n## Примеры\n\nТут представлена лишь малая доля возможных примеров работы с объектным массивом `CoverArray`.\nИзучите API класса для более углублённого понимания.\n\n#### Пример:\n\n```php\n$value = $cover\n    -\u003eget('languages.frontend')\n    -\u003efilter(function ($value) {\n        return preg_match('~CSS~', $value);\n    })\n    -\u003eimplode(', ');\n\nvar_dump($value);\n```\n\nРезультат:\n\n```\nstring(16) \"CSS1, CSS2, CSS3\"\n```\n\n#### Пример:\n\n```php\n$value = $cover\n    -\u003eget('languages.frontend')\n    -\u003eappend('HTML 5', 'jQuey')\n    -\u003egetDataAsArray();\n\nvar_dump($value);\n```\n\nРезультат:\n\n```\narray(7) {\n  [0]=\u003e\n  string(4) \"HTML\"\n  [1]=\u003e\n  string(4) \"CSS1\"\n  [2]=\u003e\n  string(10) \"JavaScript\"\n  [3]=\u003e\n  string(4) \"CSS2\"\n  [4]=\u003e\n  string(4) \"CSS3\"\n  [5]=\u003e\n  string(6) \"HTML 5\"\n  [6]=\u003e\n  string(5) \"jQuey\"\n}\n```\n\n#### Пример:\n\n```php\nvar_dump($cover['languages']['backend'][0]);\nvar_dump($cover-\u003elanguages-\u003ebackend-\u003eitem(0));\nvar_dump($cover-\u003eget('languages.backend.0'));\nvar_dump($cover-\u003eget('languages')-\u003eitem('backend')[0]);\nvar_dump($cover-\u003eget('languages')['backend']-\u003eitem(0));\n```\n\nРезультат:\n\n```\nstring(3) \"PHP\"\nstring(3) \"PHP\"\nstring(3) \"PHP\"\nstring(3) \"PHP\"\nstring(3) \"PHP\"\n```\n\n#### Пример:\n\n```php\nvar_dump($cover-\u003eget('languages.backend')-\u003egetFirst());\nvar_dump($cover-\u003eget('languages.backend')-\u003egetLast());\n```\n\nРезультат:\n\n```\nstring(3) \"PHP\"\nstring(5) \"MySql\"\n```\n\n#### Пример:\n\n```php\nvar_dump(serialize($cover-\u003eget('languages.backend')));\n```\n\nРезультат:\n\n```\nstring(54) \"O:12:\"NewTypeArray\":2:{i:0;s:3:\"PHP\";i:1;s:5:\"MySql\";}\"\n```\n\n#### Пример:\n\n```php\n$value = $cover-\u003eget('languages')-\u003emap(function (CoverArray $lang, string $key) {\n    return sprintf(\n        \"\\n\\t\u003cli\u003e%s (%s):\\n\\t%s\\n\\t\u003c/li\u003e\",\n        $key,\n        $lang-\u003ecount(),\n        $lang-\u003emap(fn($value): string =\u003e \"\\t\u003cli\u003e$value\u003c/li\u003e\")-\u003eimplode(\"\\n\\t\")\n    );\n})\n    -\u003eprepend(\"\\n\u003cul\u003e\")\n    -\u003eappend(\"\\n\u003c/ul\u003e\")\n    -\u003eimplode('');\n\nvar_dump($value);\n```\n\nРезультат:\n\n```\nstring(180) \"\n\u003cul\u003e\n        \u003cli\u003ebackend (2):\n                \u003cli\u003ePHP\u003c/li\u003e\n                \u003cli\u003eMySql\u003c/li\u003e\n        \u003c/li\u003e\n        \u003cli\u003efrontend (5):\n                \u003cli\u003eHTML\u003c/li\u003e\n                \u003cli\u003eCSS1\u003c/li\u003e\n                \u003cli\u003eJavaScript\u003c/li\u003e\n                \u003cli\u003eCSS2\u003c/li\u003e\n                \u003cli\u003eCSS3\u003c/li\u003e\n        \u003c/li\u003e\n\u003c/ul\u003e\"\n```\n\n#### Пример:\n\n```php\n$value = NewTypeArray::fromExplode(',', '1,1,2,1,2,2,1,,1,,,2')\n    -\u003eunique()\n    -\u003efilter()\n    -\u003eimplode(',');\n\nvar_dump($value);\n```\n\nРезультат:\n\n```\nstring(3) \"1,2\"\n```\n\n#### Пример:\n\n```php\nvar_dump($cover-\u003eget('languages.backend')-\u003egetDataAsArray());\nvar_dump($cover-\u003eget('languages.backend')-\u003ereverse()-\u003egetDataAsArray());\n```\n\nРезультат:\n\n```\narray(2) {\n  [0]=\u003e\n  string(3) \"PHP\"\n  [1]=\u003e\n  string(5) \"MySql\"\n}\narray(2) {\n  [0]=\u003e\n  string(5) \"MySql\"\n  [1]=\u003e\n  string(3) \"PHP\"\n}\n```\n\n#### Пример:\n\n```php\nvar_dump($cover-\u003eget('languages.backend')-\u003ein('PHP'));\n```\n\nРезультат:\n\n```\nbool(true)\n```\n\n#### Пример:\n\n```php\n$value = $cover-\u003eget('languages.frontend')-\u003ediff(\n    ['HTML'],\n    ['CSS1', 'CSS2', 'CSS3']\n)-\u003egetDataAsArray();\n\nvar_dump($value);\n```\n\nили даже так:\n\n```php\n$value = $cover-\u003eget('languages.frontend')-\u003ediff(\n    new NewTypeArray(['HTML']),\n    new NewTypeArray(['CSS1', 'CSS2', 'CSS3'])\n)-\u003egetDataAsArray();\n```\n\nРезультат:\n\n```\narray(1) {\n  [2]=\u003e\n  string(10) \"JavaScript\"\n}\n```\n\n#### Пример:\n\n```php\n$value = $cover-\u003eget('languages')-\u003emapRecursive(\n    fn(mixed $value, mixed $key): string =\u003e \"$key: $value\"\n)-\u003egetDataAsArray();\n\nvar_dump($value);\n```\n\nРезультат:\n\n```\narray(2) {\n  [\"backend\"]=\u003e\n  array(2) {\n    [0]=\u003e\n    string(6) \"0: PHP\"\n    [1]=\u003e\n    string(8) \"1: MySql\"\n  }\n  [\"frontend\"]=\u003e\n  array(5) {\n    [0]=\u003e\n    string(7) \"0: HTML\"\n    [1]=\u003e\n    string(7) \"1: CSS1\"\n    [2]=\u003e\n    string(13) \"2: JavaScript\"\n    [3]=\u003e\n    string(7) \"3: CSS2\"\n    [4]=\u003e\n    string(7) \"4: CSS3\"\n  }\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FVasiliy-Makogon%2FPHP-Collection","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FVasiliy-Makogon%2FPHP-Collection","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FVasiliy-Makogon%2FPHP-Collection/lists"}