{"id":21874514,"url":"https://github.com/smoren/schemator-php","last_synced_at":"2025-04-15T01:24:01.098Z","repository":{"id":53424437,"uuid":"486330556","full_name":"Smoren/schemator-php","owner":"Smoren","description":"Schematic data mapper and nested access tools","archived":false,"fork":false,"pushed_at":"2023-11-16T14:10:23.000Z","size":1726,"stargazers_count":33,"open_issues_count":0,"forks_count":7,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-03-28T13:21:13.575Z","etag":null,"topics":["accessor","data-mapper","data-mapping","mapping","nested","nested-structures","php","php-library","schema"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Smoren.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2022-04-27T19:48:16.000Z","updated_at":"2025-02-26T15:35:58.000Z","dependencies_parsed_at":"2023-11-16T14:41:35.325Z","dependency_job_id":"1887b341-6e89-4dac-8088-9d9396fd9201","html_url":"https://github.com/Smoren/schemator-php","commit_stats":{"total_commits":134,"total_committers":2,"mean_commits":67.0,"dds":0.02985074626865669,"last_synced_commit":"92a623097aaff2cd57a4d3bff1a0abd56fe86b72"},"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Smoren%2Fschemator-php","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Smoren%2Fschemator-php/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Smoren%2Fschemator-php/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Smoren%2Fschemator-php/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Smoren","download_url":"https://codeload.github.com/Smoren/schemator-php/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248986851,"owners_count":21194132,"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":["accessor","data-mapper","data-mapping","mapping","nested","nested-structures","php","php-library","schema"],"created_at":"2024-11-28T07:12:34.274Z","updated_at":"2025-04-15T01:24:01.080Z","avatar_url":"https://github.com/Smoren.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Schematic data mapper\n\n![Packagist PHP Version Support](https://img.shields.io/packagist/php-v/smoren/schemator)\n[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/Smoren/schemator-php/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/Smoren/schemator-php/?branch=master)\n[![Coverage Status](https://coveralls.io/repos/github/Smoren/schemator-php/badge.svg?branch=master)](https://coveralls.io/github/Smoren/schemator-php?branch=master)\n![Build and test](https://github.com/Smoren/schemator-php/actions/workflows/test_master.yml/badge.svg)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n![Schemator logo](docs/images/schemator-logo.png)\n\nSchematic data mapper is a tool for converting nested data structures\n(any composition of associative arrays, non-associative arrays and objects)\naccording to the given conversion schema.\n\n## How to install to your project\n\n```\ncomposer require smoren/schemator\n```\n\n## Usage\n\n### Simple usage\n\n```php\nuse Smoren\\Schemator\\Factories\\SchematorFactory;\n\n$input = [\n    'id' =\u003e 100,\n    'name' =\u003e 'Oxford',\n    'country' =\u003e [\n        'id' =\u003e 10,\n        'name' =\u003e 'UK',\n        'neighbours' =\u003e ['Ireland', 'Sweden', 'France'],\n        'capitals' =\u003e [\n            'lnd' =\u003e 'London',\n            'edb' =\u003e 'Edinburgh',\n        ],\n    ],\n    'streets' =\u003e [\n        [\n            'id' =\u003e 1000,\n            'name' =\u003e 'Woodstock Rd',\n            'houses' =\u003e [1, 5, 9],\n        ],\n        [\n            'id' =\u003e 1002,\n            'name' =\u003e 'Banbury Rd',\n            'houses' =\u003e [22, 35, 49],\n        ],\n        [\n            'id' =\u003e 1003,\n            'name' =\u003e 'Beamont St',\n            'houses' =\u003e [11, 12, 15],\n        ],\n    ],\n    'lnd_path' =\u003e 'country.capitals.lnd',\n];\n\n$schema = [\n    'city_id' =\u003e 'id',\n    'city_name' =\u003e 'name',\n    'city_street_names' =\u003e 'streets.*.name',\n    'country_id' =\u003e 'country.id',\n    'country_name' =\u003e 'country.name',\n    'country_neighbours' =\u003e 'country.neighbours',\n    'country_neighbour' =\u003e 'country.neighbours',\n    'country_first_capital' =\u003e 'country.capitals.lnd',\n    'country_second_capital' =\u003e 'country.capitals.edb',\n    'country_data.country_id' =\u003e 'country.id',\n    'country_data.country_name' =\u003e 'country.name',\n];\n\n$schemator = SchematorFactory::create();\n$output = $schemator-\u003econvert($input, $schema);\n\nprint_r($output);\n/* Array\n(\n    [city_id] =\u003e 100\n    [city_name] =\u003e Oxford\n    [city_street_names] =\u003e Array\n        (\n            [0] =\u003e Woodstock Rd\n            [1] =\u003e Banbury Rd\n            [2] =\u003e Beamont St\n        )\n\n    [country_id] =\u003e 10\n    [country_name] =\u003e UK\n    [country_neighbours] =\u003e Array\n        (\n            [0] =\u003e Ireland\n            [1] =\u003e Sweden\n            [2] =\u003e France\n        )\n\n    [country_neighbour] =\u003e Array\n        (\n            [0] =\u003e Ireland\n            [1] =\u003e Sweden\n            [2] =\u003e France\n        )\n\n    [country_first_capital] =\u003e London\n    [country_second_capital] =\u003e Edinburgh\n    [country_data] =\u003e Array\n        (\n            [country_id] =\u003e 10\n            [country_name] =\u003e UK\n        )\n\n)\n*/\n```\n\n### Setting errors level\n\n```php\nuse Smoren\\Schemator\\Factories\\SchematorFactory;\nuse Smoren\\Schemator\\Structs\\ErrorsLevelMask;\nuse Smoren\\Schemator\\Exceptions\\SchematorException;\n\n$input = [\n    'some_key' =\u003e null,\n];\n$schema = [\n    'my_value' =\u003e ['some_key', ['date', 'Y-m-d']],\n];\n\n$schemator = SchematorFactory::createBuilder()\n    -\u003ewithErrorsLevelMask(\n        ErrorsLevelMask::nothing()\n            -\u003eadd([SchematorException::FILTER_ERROR, SchematorException::CANNOT_GET_VALUE])\n    )\n    -\u003eget();\n\ntry {\n    $schemator-\u003econvert($input, $schema);\n} catch(SchematorException $e) {\n    echo $e-\u003egetMessage(); // filter error: 'date'\n}\n\n```\n\n### Using base filters\n\n```php\nuse Smoren\\Schemator\\Factories\\SchematorFactory;\nuse Smoren\\Schemator\\Filters\\BaseFiltersStorage;\n\n$input = [\n    'id' =\u003e 100,\n    'name' =\u003e 'Oxford',\n    'country' =\u003e [\n        'id' =\u003e 10,\n        'name' =\u003e 'UK',\n        'neighbours' =\u003e ['Ireland', 'Sweden', 'France'],\n        'capitals' =\u003e [\n            'lnd' =\u003e 'London',\n            'edb' =\u003e 'Edinburgh',\n        ],\n    ],\n    'streets' =\u003e [\n        [\n            'id' =\u003e 1000,\n            'name' =\u003e 'Woodstock Rd',\n            'houses' =\u003e [1, 5, 9],\n        ],\n        [\n            'id' =\u003e 1002,\n            'name' =\u003e 'Banbury Rd',\n            'houses' =\u003e [22, 35, 49],\n        ],\n        [\n            'id' =\u003e 1003,\n            'name' =\u003e 'Beamont St',\n            'houses' =\u003e [11, 12, 15],\n        ],\n    ],\n    'lnd_path' =\u003e 'country.capitals.lnd',\n];\n\n$schema = [\n    'city_street_names.all' =\u003e ['streets.*.name', ['implode', ', ']],\n    'city_street_names.sorted' =\u003e ['streets.*.name', ['sort'], ['implode', ', ']],\n    'city_street_names.filtered' =\u003e ['streets.*.name', ['filter', fn (string $candidate) =\u003e strpos($candidate, 'Ban') !== false]],\n    'lnd' =\u003e ['lnd_path', ['path']],\n    'city_street_houses' =\u003e ['streets.*.houses', ['flatten']],\n];\n\n$schemator = SchematorFactory::create();\n$output = $schemator-\u003econvert($input, $schema);\n\nprint_r($output);\n/*\nArray\n(\n    [city_street_names] =\u003e Array\n        (\n            [all] =\u003e Woodstock Rd, Banbury Rd, Beamont St\n            [sorted] =\u003e Banbury Rd, Beamont St, Woodstock Rd\n            [filtered] =\u003e Array\n                (\n                    [0] =\u003e Banbury Rd\n                )\n\n        )\n\n    [lnd] =\u003e London\n    [city_street_houses] =\u003e Array\n        (\n            [0] =\u003e 1\n            [1] =\u003e 5\n            [2] =\u003e 9\n            [3] =\u003e 22\n            [4] =\u003e 35\n            [5] =\u003e 49\n            [6] =\u003e 11\n            [7] =\u003e 12\n            [8] =\u003e 15\n        )\n\n)\n*/\n```\n\n### Using smart filter and replace\n\n```php\nuse Smoren\\Schemator\\Factories\\SchematorFactory;\nuse Smoren\\Schemator\\Filters\\BaseFiltersStorage;\n\n$schemator = SchematorFactory::create();\n$input = [\n    'numbers' =\u003e [-1, 10, 5, 22, -10, 0, 35, 7, 8, 9, 0],\n];\n\n$output = $schemator-\u003econvert($input, [\n    'positive' =\u003e [\n        'numbers',\n        ['filter', [['\u003e', 0]]],\n        ['sort'],\n    ],\n    'negative' =\u003e [\n        'numbers',\n        ['filter', [['\u003c', 0]]],\n        ['sort'],\n    ],\n    'complicated' =\u003e [\n        'numbers',\n        ['filter', [['\u003e=', 8], ['\u003c', 0]]],\n        ['filter', [['\u003c', 22]]],\n        ['sort'],\n    ],\n]);\n\nprint_r($output);\n/*\nArray\n(\n    [positive] =\u003e Array\n        (\n            [0] =\u003e 5\n            [1] =\u003e 7\n            [2] =\u003e 8\n            [3] =\u003e 9\n            [4] =\u003e 10\n            [5] =\u003e 22\n            [6] =\u003e 35\n        )\n\n    [negative] =\u003e Array\n        (\n            [0] =\u003e -10\n            [1] =\u003e -1\n        )\n\n    [complicated] =\u003e Array\n        (\n            [0] =\u003e -10\n            [1] =\u003e -1\n            [2] =\u003e 8\n            [3] =\u003e 9\n            [4] =\u003e 10\n        )\n\n)\n*/\n\n$output = $schemator-\u003econvert($input, [\n    'number_types' =\u003e ['numbers', [\n        'replace',\n        [\n            ['=0', '=', 0],\n            ['\u003e9', '\u003e', 9],\n            ['\u003c0', '\u003c', 0],\n            ['1-8', 'between', 1, 8],\n        ]\n    ]]\n]);\n\nprint_r($output);\n/*\nArray\n(\n    [number_types] =\u003e Array\n        (\n            [0] =\u003e \u003c0\n            [1] =\u003e \u003e9\n            [2] =\u003e 1-8\n            [3] =\u003e \u003e9\n            [4] =\u003e \u003c0\n            [5] =\u003e =0\n            [6] =\u003e \u003e9\n            [7] =\u003e 1-8\n            [8] =\u003e 1-8\n            [9] =\u003e 9\n            [10] =\u003e =0\n        )\n\n)\n*/\n```\n\n### Using custom filters\n\n```php\nuse Smoren\\Schemator\\Factories\\SchematorFactory;\nuse Smoren\\Schemator\\Interfaces\\FilterContextInterface;\n\n$schemator = SchematorFactory::createBuilder()\n    -\u003ewithFilters([\n        'startsWith' =\u003e function (FilterContextInterface $context, string $start) {\n            return array_filter($context-\u003egetSource(), function (string $candidate) use ($start) {\n                return strpos($candidate, $start) === 0;\n            });\n        },\n    ])\n    -\u003eget();\n\n$input = [\n    'streets' =\u003e ['Woodstock Rd', 'Banbury Rd', 'Beamont St'],\n];\n\n$schema = [\n    'street_names' =\u003e ['streets', ['startsWith', 'T'], ['implode', ', ']],\n];\n\n$output = $schemator-\u003econvert($input, $schema);\n\nprint_r($output);\n/*\nArray\n(\n    [street_names] =\u003e Woodstock Rd, Beamont St\n)\n*/\n```\n\n### Mass usage\n\n```php\nuse Smoren\\Schemator\\Factories\\SchematorFactory;\n\n$massSchemator = SchematorFactory::createMass();\n\n$cities = [\n    [\n        'id' =\u003e 100,\n        'name' =\u003e 'London',\n        'country' =\u003e [\n            'id' =\u003e 10,\n            'name' =\u003e 'UK',\n        ],\n        'streets' =\u003e [\n            [\n                'id' =\u003e 1001,\n                'name' =\u003e 'The Mall',\n            ],\n            [\n                'id' =\u003e 1002,\n                'name' =\u003e 'Carnaby Street',\n            ],\n        ],\n    ],\n    [\n        'id' =\u003e 101,\n        'name' =\u003e 'Oxford',\n        'country' =\u003e [\n            'id' =\u003e 10,\n            'name' =\u003e 'UK',\n        ],\n        'streets' =\u003e [\n            [\n                'id' =\u003e 1003,\n                'name' =\u003e 'Turl Street',\n            ],\n            [\n                'id' =\u003e 1004,\n                'name' =\u003e 'Holywell Street',\n            ],\n        ],\n    ],\n];\n\n$schema = [\n    'city_id' =\u003e 'id',\n    'city_name' =\u003e 'name',\n    'city_street_names' =\u003e 'streets.*.name',\n    'country_id' =\u003e 'country.id',\n    'country_name' =\u003e 'country.name',\n];\n\n$gen = $massSchemator-\u003egenerate($cities, $schema);\n\n$result = [];\nforeach($gen as $item) {\n    $result[] = $item;\n}\n\nprint_r($result);\n/*\nArray\n(\n    [0] =\u003e Array\n        (\n            [city_id] =\u003e 100\n            [city_name] =\u003e London\n            [city_street_names] =\u003e Array\n                (\n                    [0] =\u003e The Mall\n                    [1] =\u003e Carnaby Street\n                )\n\n            [country_id] =\u003e 10\n            [country_name] =\u003e UK\n        )\n    [1] =\u003e Array\n        (\n            [city_id] =\u003e 101\n            [city_name] =\u003e Oxford\n            [city_street_names] =\u003e Array\n                (\n                    [0] =\u003e Turl Street\n                    [1] =\u003e Holywell Street\n                )\n\n            [country_id] =\u003e 10\n            [country_name] =\u003e UK\n        )\n)\n*/\n```\n\n## Filters\n\n### const\n\nSets the value from const param.\n\nSchema:\n\n```php\n[\"value\" =\u003e [[\"const\", \"My const value\"]]]\n```\n\nResult:\n\n```php\n[\"value\" =\u003e \"My const value\"]\n```\n\n### sum\n\nReturns the sum of given array.\n\nGiven:\n\n```php\n[\"numbers\" =\u003e [1, 2, 3, 4, 5]]\n```\n\nSchema:\n\n```php\n[\"value\" =\u003e [\"numbers\", [\"sum\"]]]\n```\n\nResult:\n\n```php\n[\"value\" =\u003e 15]\n```\n\n### average\n\nReturns the average of given array.\n\nGiven:\n\n```php\n[\"numbers\" =\u003e [1, 2, 3, 4, 5]]\n```\n\nSchema:\n\n```php\n[\"value\" =\u003e [\"numbers\", [\"average\"]]]\n```\n\nResult:\n\n```php\n[\"value\" =\u003e 3]\n```\n\n### date\n\nReturns formatted date from the Unix timestamp given value.\n\nParams:\n\n1. Date format\n    * required\n    * data type — string\n    * example: `d.m.Y H:i:s`\n    * [more about formats](https://www.php.net/manual/ru/datetime.format.php)\n2. Time zone offset from GMT\n    * optional\n    * data type — integer\n    * default — 0\n\nGiven:\n\n```php\n[\"some_date\" =\u003e 1651481881]\n```\n\nSchema:\n\n```php\n[\"value\" =\u003e [\"some_date\", [\"date\", \"d.m.Y H:i:s\", 3]]]\n```\n\nResult:\n\n```php\n[\"value\" =\u003e \"02.05.2022 11:58:01\"]\n```\n\n### implode\n\nReturns string of imploded items of given array with separator from args list.\n\nparams:\n\n1. Separator\n    * required\n    * data type — string\n    * example: `; `\n\nGiven:\n\n```php\n[\"numbers\" =\u003e [1, 2, 3, 4, 5]]\n```\n\nSchema:\n\n```php\n[\"value\" =\u003e [\"numbers\", [\"implode\", \"; \"]]]\n```\n\nResult:\n\n```php\n[\"value\" =\u003e \"1; 2; 3; 4; 5\"]\n```\n\n### explode\n\nReturns array of exploded strings from given string with separator from args list\n\nparams:\n\n1. Separator\n    * required\n    * data type — string\n    * example: `; `\n\nGiven:\n\n```php\n[\"numbers\" =\u003e \"1; 2; 3; 4; 5\"]\n```\n\nSchema:\n\n```php\n[\"value\" =\u003e [\"numbers\", [\"explode\", \"; \"]]]\n```\n\nResult:\n\n```php\n[\"value\" =\u003e [\"1\", \"2\", \"3\", \"4\", \"5\"]]\n```\n\n### flatten\n\nReturns flat array contains all the dead end leaves of tree array.\n\nGiven:\n\n```php\n[\n   \"numbers\" =\u003e [\n      [\n         [1, 2, 3],\n         [4, 5, 6]\n      ],\n      [7, 8, 9]\n   ],\n]\n```\n\nSchema:\n\n```php\n[\"value\" =\u003e [\"numbers\", [\"flatten\"]]]\n```\n\nResult:\n\n```php\n[\"value\" =\u003e [1, 2, 3, 4, 5, 6, 7, 8, 9]]\n```\n\n### sort\n\nSorts and returns given array.\n\nGiven:\n\n```php\n[\"numbers\" =\u003e [3, 5, 4, 1, 2]]\n```\n\nSchema:\n\n```php\n[\"value\" =\u003e [\"numbers\", [\"sort\"]]]\n```\n\nResult:\n\n```php\n[\"value\" =\u003e [1, 2, 3, 4, 5]]\n```\n\n### rsort\n\nSorts reversely and returns given array.\n\nGiven:\n\n```php\n[\"numbers\" =\u003e [3, 5, 4, 1, 2]]\n```\n\nSchema:\n\n```php\n[\"value\" =\u003e [\"numbers\", [\"sort\"]]]\n```\n\nResult:\n\n```php\n[\"value\" =\u003e [5, 4, 3, 2, 1]]\n```\n\n### filter\n\nReturns array containing elements from given array that match the predicates from the params list.\n\nRules:\n\n* Every predicate has such format `[\"predicate name\", ...parans]`.\n* Predicates in one filter apply according the \"OR\" logic.\n* To apply \"AND\" logic use [chain of filters](#Chain-of-filters).\n* Available predicates:\n    * `[\"=\", 10]` means `value = 10`\n    * `[\"\u003e\", 10]` means `value \u003e 10`\n    * `[\"\u003e=\", 10]` means `value \u003e= 10`\n    * `[\"\u003c\", 10]` means `value \u003c 10`\n    * `[\"\u003c=\", 10]` means `value \u003c= 10`\n    * `[\"in\", [1, 2]]` means `value = 1 OR value = 2`\n    * `[\"not in\", [1, 2]]` means `value != 1 AND value != 2`\n    * `[\"between\", 1, 5]` means `1 \u003c= value \u003c= 5`\n    * `[\"between strict\", 1, 5]` means `1 \u003c value \u003c 5`\n\nGiven:\n\n```php\n[\"numbers\" =\u003e [-5, -3, -1, 1, 3, 5]]\n```\n\nSchema:\n\n```php\n[\n   \"value\" =\u003e [\n      \"numbers\",\n      [\n         \"filter\",\n         [[\"\u003e\", 1], [\"\u003c\", -1]] // value \u003e 1 OR value \u003c -1\n      ],\n   ],\n]\n```\n\nResult:\n\n```php\n[\"value\" =\u003e [-5, -3, 3, 5]]\n```\n\n### replace\n\nReturns array of elements with values replaced according to the rules in the params list.\n\nRules:\n\n* Every rule has such format `[\"value to replace\", \"rule name\", ...params]`.\n* Rules in one filter apply according the \"OR\" logic.\n* To apply \"AND\" logic use [chain of filters](#Chain-of-filters).\n* Available rules:\n    * `[\"=\", 10]` means `value = 10`\n    * `[\"\u003e\", 10]` means `value \u003e 10`\n    * `[\"\u003e=\", 10]` means `value \u003e= 10`\n    * `[\"\u003c\", 10]` means `value \u003c 10`\n    * `[\"\u003c=\", 10]` means `value \u003c= 10`\n    * `[\"in\", [1, 2]]` means `value = 1 или value = 2`\n    * `[\"not in\", [1, 2]]` means `value != 1 и value != 2`\n    * `[\"between\", 1, 5]` means `1 \u003c= value \u003c= 5`\n    * `[\"between strict\", 1, 5]` means `1 \u003c value \u003c 5`\n    * `[\"else\"]` — no rules matched for value\n      _(If rule `else` did not use, by default such values are replaced with `null`)_\n\nGiven:\n\n```php\n[\"numbers\" =\u003e [-5, -3, -1, 0, 1, 3, 5]]\n```\n\nSchema:\n\n```php\n[\n   \"value\" =\u003e [\n      \"numbers\",\n      [\n         \"replace\",\n         [\n            [\"positive\", \"\u003e\", 0],\n            [\"negative\", \"\u003c\", 0],\n            [\"zero\", \"else\"]\n         ],\n      ],\n   ],\n]\n```\n\nResult:\n\n```php\n[\"value\" =\u003e [\"negative\", \"negative\", \"negative\", \"zero\", \"positive\", \"positive\", \"positive\"]]\n```\n\n### Chain of filters\n\nGiven:\n\n```php\n[\"numbers\" =\u003e [-5, -3, -1, 1, 3, 5]]\n```\n\nSchema:\n\n```php\n[\n   \"value\" =\u003e [\n      \"numbers\",\n      [\n         \"filter\",\n         [[\"\u003e\", 1], [\"\u003c\", -1]] // (value \u003e 1 OR value \u003c -1)\n      ],\n      // AND\n      [\n         \"filter\",\n         [[\"\u003e=\", -3]] // value \u003e= -3\n      ],\n   ],\n]\n```\n\nResult:\n\n```php\n[\"value\" =\u003e [-3, 3, 5]]\n```\n\n## Unit testing\n\n```\ncomposer install\ncomposer test-init\ncomposer test\n```\n\n## Standards\n\nSchemator conforms to the following standards:\n\n* PSR-1 — [Basic coding standard](https://www.php-fig.org/psr/psr-1/)\n* PSR-4 — [Autoloader](https://www.php-fig.org/psr/psr-4/)\n* PSR-12 — [Extended coding style guide](https://www.php-fig.org/psr/psr-12/)\n\n## License\n\nSchemator is licensed under the MIT License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmoren%2Fschemator-php","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsmoren%2Fschemator-php","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmoren%2Fschemator-php/lists"}