| Recommend this page to a friend! | 
|  Download | 
| Info | Documentation |  Files |  Install with Composer |  Download | Reputation | Support forum | Blog | Links | 
| Ratings | Unique User Downloads | Download Rankings | ||||
| Not enough user ratings | Total: 39 | All time:  10,941 This week: 40  | ||||
| Version | License | PHP version | Categories | |||
| schemator-php 1.0 | MIT/X Consortium ... | 7.4 | Libraries, Data types, PHP 7 | 
| Description | Author | |
| This package can process and convert nested arrays and objects. | 

Schematic data mapper is a tool for converting nested data structures (any compositions of associative arrays, non-associative arrays and objects) according to the given conversion schema.
composer require smoren/schemator
use Smoren\Schemator\Factories\SchematorFactory;
$input = [
    'id' => 100,
    'name' => 'Oxford',
    'country' => [
        'id' => 10,
        'name' => 'UK',
        'neighbours' => ['Ireland', 'Sweden', 'France'],
        'capitals' => [
            'lnd' => 'London',
            'edb' => 'Edinburgh',
        ],
    ],
    'streets' => [
        [
            'id' => 1000,
            'name' => 'Woodstock Rd',
            'houses' => [1, 5, 9],
        ],
        [
            'id' => 1002,
            'name' => 'Banbury Rd',
            'houses' => [22, 35, 49],
        ],
        [
            'id' => 1003,
            'name' => 'Beamont St',
            'houses' => [11, 12, 15],
        ],
    ],
    'lnd_path' => 'country.capitals.lnd',
];
$schema = [
    'city_id' => 'id',
    'city_name' => 'name',
    'city_street_names' => 'streets.name',
    'country_id' => 'country.id',
    'country_name' => 'country.name',
    'country_neighbours' => 'country.neighbours',
    'country_neighbour' => 'country.neighbours',
    'country_first_capital' => 'country.capitals.lnd',
    'country_second_capital' => 'country.capitals.edb',
    'country_data.country_id' => 'country.id',
    'country_data.country_name' => 'country.name',
];
$schemator = SchematorFactory::create();
$output = $schemator->convert($input, $schema);
print_r($output);
/* Array
(
    [city_id] => 100
    [city_name] => Oxford
    [city_street_names] => Array
        (
            [0] => Woodstock Rd
            [1] => Banbury Rd
            [2] => Beamont St
        )
    [country_id] => 10
    [country_name] => UK
    [country_neighbours] => Array
        (
            [0] => Ireland
            [1] => Sweden
            [2] => France
        )
    [country_neighbour] => Array
        (
            [0] => Ireland
            [1] => Sweden
            [2] => France
        )
    [country_first_capital] => London
    [country_second_capital] => Edinburgh
    [country_data] => Array
        (
            [country_id] => 10
            [country_name] => UK
        )
)
*/
use Smoren\Schemator\Factories\SchematorFactory;
use Smoren\Schemator\Structs\ErrorsLevelMask;
use Smoren\Schemator\Exceptions\SchematorException;
$input = [
    'some_key' => null,
];
$schema = [
    'my_value' => ['some_key', ['date', 'Y-m-d']],
];
$schemator = SchematorFactory::createBuilder()
    ->withErrorsLevelMask(
        ErrorsLevelMask::nothing()
            ->add([SchematorException::FILTER_ERROR, SchematorException::CANNOT_GET_VALUE])
    )
    ->get();
try {
    $schemator->convert($input, $schema);
} catch(SchematorException $e) {
    echo $e->getMessage(); // filter error: 'date'
}
use Smoren\Schemator\Factories\SchematorFactory;
use Smoren\Schemator\Filters\BaseFiltersStorage;
$input = [
    'id' => 100,
    'name' => 'Oxford',
    'country' => [
        'id' => 10,
        'name' => 'UK',
        'neighbours' => ['Ireland', 'Sweden', 'France'],
        'capitals' => [
            'lnd' => 'London',
            'edb' => 'Edinburgh',
        ],
    ],
    'streets' => [
        [
            'id' => 1000,
            'name' => 'Woodstock Rd',
            'houses' => [1, 5, 9],
        ],
        [
            'id' => 1002,
            'name' => 'Banbury Rd',
            'houses' => [22, 35, 49],
        ],
        [
            'id' => 1003,
            'name' => 'Beamont St',
            'houses' => [11, 12, 15],
        ],
    ],
    'lnd_path' => 'country.capitals.lnd',
];
$schema = [
    'city_street_names.all' => ['streets.name', ['implode', ', ']],
    'city_street_names.sorted' => ['streets.name', ['sort'], ['implode', ', ']],
    'city_street_names.filtered' => ['streets.name', ['filter', function (string $candidate) {
        return strpos($candidate, 'Ban') !== false;
    }]],
    'lnd' => ['lnd_path', ['path']],
    'city_street_houses' => ['streets.houses', ['flatten']],
];
$schemator = SchematorFactory::create();
$output = $schemator->convert($input, $schema);
print_r($output);
/*
Array
(
    [city_street_names] => Array
        (
            [all] => Woodstock Rd, Banbury Rd, Beamont St
            [sorted] => Banbury Rd, Beamont St, Woodstock Rd
            [filtered] => Array
                (
                    [0] => Banbury Rd
                )
        )
    [lnd] => London
    [city_street_houses] => Array
        (
            [0] => 1
            [1] => 5
            [2] => 9
            [3] => 22
            [4] => 35
            [5] => 49
            [6] => 11
            [7] => 12
            [8] => 15
        )
)
*/
use Smoren\Schemator\Factories\SchematorFactory;
use Smoren\Schemator\Filters\BaseFiltersStorage;
$schemator = SchematorFactory::create();
$input = [
    'numbers' => [-1, 10, 5, 22, -10, 0, 35, 7, 8, 9, 0],
];
$output = $schemator->convert($input, [
    'positive' => [
        'numbers',
        ['filter', [['>', 0]]],
        ['sort'],
    ],
    'negative' => [
        'numbers',
        ['filter', [['<', 0]]],
        ['sort'],
    ],
    'complicated' => [
        'numbers',
        ['filter', [['>=', 8], ['<', 0]]],
        ['filter', [['<', 22]]],
        ['sort'],
    ],
]);
print_r($output);
/*
Array
(
    [positive] => Array
        (
            [0] => 5
            [1] => 7
            [2] => 8
            [3] => 9
            [4] => 10
            [5] => 22
            [6] => 35
        )
    [negative] => Array
        (
            [0] => -10
            [1] => -1
        )
    [complicated] => Array
        (
            [0] => -10
            [1] => -1
            [2] => 8
            [3] => 9
            [4] => 10
        )
)
*/
$output = $schemator->convert($input, [
    'number_types' => ['numbers', [
        'replace',
        [
            ['=0', '=', 0],
            ['>9', '>', 9],
            ['<0', '<', 0],
            ['1-8', 'between', 1, 8],
        ]
    ]]
]);
print_r($output);
/*
Array
(
    [number_types] => Array
        (
            [0] => <0
            [1] => >9
            [2] => 1-8
            [3] => >9
            [4] => <0
            [5] => =0
            [6] => >9
            [7] => 1-8
            [8] => 1-8
            [9] => 9
            [10] => =0
        )
)
*/
use Smoren\Schemator\Factories\SchematorFactory;
use Smoren\Schemator\Interfaces\FilterContextInterface;
$schemator = SchematorFactory::createBuilder()
    ->withFilters([
        'startsWith' => function (FilterContextInterface $context, string $start) {
            return array_filter($context->getSource(), function (string $candidate) use ($start) {
                return strpos($candidate, $start) === 0;
            });
        },
    ])
    ->get();
$input = [
    'streets' => ['Woodstock Rd', 'Banbury Rd', 'Beamont St'],
];
$schema = [
    'street_names' => ['streets', ['startsWith', 'T'], ['implode', ', ']],
];
$output = $schemator->convert($input, $schema);
print_r($output);
/*
Array
(
    [street_names] => Woodstock Rd, Beamont St
)
*/
use Smoren\Schemator\Factories\SchematorFactory;
$massSchemator = SchematorFactory::createMass();
$cities = [
    [
        'id' => 100,
        'name' => 'London',
        'country' => [
            'id' => 10,
            'name' => 'UK',
        ],
        'streets' => [
            [
                'id' => 1001,
                'name' => 'The Mall',
            ],
            [
                'id' => 1002,
                'name' => 'Carnaby Street',
            ],
        ],
    ],
    [
        'id' => 101,
        'name' => 'Oxford',
        'country' => [
            'id' => 10,
            'name' => 'UK',
        ],
        'streets' => [
            [
                'id' => 1003,
                'name' => 'Turl Street',
            ],
            [
                'id' => 1004,
                'name' => 'Holywell Street',
            ],
        ],
    ],
];
$schema = [
    'city_id' => 'id',
    'city_name' => 'name',
    'city_street_names' => 'streets.name',
    'country_id' => 'country.id',
    'country_name' => 'country.name',
];
$gen = $massSchemator->generate($cities, $schema);
$result = [];
foreach($gen as $item) {
    $result[] = $item;
}
print_r($result);
/*
Array
(
    [0] => Array
        (
            [city_id] => 100
            [city_name] => London
            [city_street_names] => Array
                (
                    [0] => The Mall
                    [1] => Carnaby Street
                )
            [country_id] => 10
            [country_name] => UK
        )
    [1] => Array
        (
            [city_id] => 101
            [city_name] => Oxford
            [city_street_names] => Array
                (
                    [0] => Turl Street
                    [1] => Holywell Street
                )
            [country_id] => 10
            [country_name] => UK
        )
)
*/
Sets the value from const param.
Schema:
["value" => [["const", "My const value"]]]
Result:
["value" => "My const value"]
Returns the sum of given array.
Given:
["numbers" => [1, 2, 3, 4, 5]]
Schema:
["value" => ["numbers", ["sum"]]]
Result:
["value" => 15]
Returns the average of given array.
Given:
["numbers" => [1, 2, 3, 4, 5]]
Schema:
["value" => ["numbers", ["average"]]]
Result:
["value" => 3]
Returns formatted date from the Unix timestamp given value.
Params:
Given:
["some_date" => 1651481881]
Schema:
["value" => ["some_date", ["date", "d.m.Y H:i:s", 3]]]
Result:
["value" => "02.05.2022 11:58:01"]
Returns string of imploded items of given array with separator from args list.
params:
Given:
["numbers" => [1, 2, 3, 4, 5]]
Schema:
["value" => ["numbers", ["implode", "; "]]]
Result:
["value" => "1; 2; 3; 4; 5"]
Returns array of exploded strings from given string with separator from args list
params:
Given:
["numbers" => "1; 2; 3; 4; 5"]
Schema:
["value" => ["numbers", ["explode", "; "]]]
Result:
["value" => ["1", "2", "3", "4", "5"]]
Returns flat array contains all the dead end leaves of tree array.
Given:
[
   "numbers" => [
      [
         [1, 2, 3],
         [4, 5, 6]
      ],
      [7, 8, 9]
   ],
]
Schema:
["value" => ["numbers", ["flatten"]]]
Result:
["value" => [1, 2, 3, 4, 5, 6, 7, 8, 9]]
Sorts and returns given array.
Given:
["numbers" => [3, 5, 4, 1, 2]]
Schema:
["value" => ["numbers", ["sort"]]]
Result:
["value" => [1, 2, 3, 4, 5]]
Sorts reversely and returns given array.
Given:
["numbers" => [3, 5, 4, 1, 2]]
Schema:
["value" => ["numbers", ["sort"]]]
Result:
["value" => [5, 4, 3, 2, 1]]
Returns array contains elements from given array, that match the predicates from params list.
Rules:
Given:
["numbers" => [-5, -3, -1, 1, 3, 5]]
Schema:
[
   "value" => [
      "numbers",
      [
         "filter",
         [[">", 1], ["<", -1]] // value > 1 OR value < -1
      ],
   ],
]
Result:
["value" => [-5, -3, 3, 5]]
Returns array of elements from given array with replaces by rules from params list.
Rules:
Given:
["numbers" => [-5, -3, -1, 1, 3, 5]]
Schema:
[
   "value" => [
      "numbers",
      [
         "replace",
         [
            ["positive", ">", 0],
            ["negative", "<", 0],
            ["zero", "else"]
         ],
      ],
   ],
]
Result:
["value" => ["negative", "negative", "negative", "zero", "positive", "positive", "positive"]]
Given:
["numbers" => [-5, -3, -1, 1, 3, 5]]
Schema:
[
   "value" => [
      "numbers",
      [
         "filter",
         [[">", 1], ["<", -1]] // (value > 1 OR value < -1)
      ],
      // AND
      [
         "filter",
         [[">=", -3]] // value >= -3
      ],
   ],
]
Result:
["value" => [-3, 3, 5]]
composer install
composer test-init
composer test
Schemator conforms to the following standards:
Schemator is licensed under the MIT License.
|  Files (28) | 
| File | Role | Description | ||
|---|---|---|---|---|
|  .github (1 directory) | ||||
|  docs (1 directory) | ||||
|  src (7 directories) | ||||
|  tests (3 files, 2 directories) | ||||
|    .travis.yml | Data | Auxiliary data | ||
|    codeception.yml | Data | Auxiliary data | ||
|    composer.json | Data | Auxiliary data | ||
|    LICENSE | Lic. | License text | ||
|    README.md | Doc. | Documentation | ||
|  Files (28) | / | src | 
| File | Role | Description | ||
|---|---|---|---|---|
|  Components (2 files) | ||||
|  Exceptions (1 file) | ||||
|  Factories (2 files) | ||||
|  Filters (1 file) | ||||
|  Interfaces (5 files) | ||||
|  Structs (2 files) | ||||
|  Util (2 files) | ||||
|  Files (28) | / | src | / | Components | 
| File | Role | Description | 
|---|---|---|
|  MassSchemator.php | Class | Class source | 
|  Schemator.php | Class | Class source | 
|  Files (28) | / | src | / | Factories | 
| File | Role | Description | 
|---|---|---|
|  SchematorBuilder.php | Class | Class source | 
|  SchematorFactory.php | Class | Class source | 
|  Files (28) | / | src | / | Interfaces | 
| File | Role | Description | 
|---|---|---|
|  FilterContextInterface.php | Class | Class source | 
|  FiltersStorageInterface.php | Class | Class source | 
|  MassSchematorInterface.php | Class | Class source | 
|  SchematorBuilderInterface.php | Class | Class source | 
|  SchematorInterface.php | Class | Class source | 
|  Files (28) | / | src | / | Structs | 
| File | Role | Description | 
|---|---|---|
|  ErrorsLevelMask.php | Class | Class source | 
|  FilterContext.php | Class | Class source | 
|  Files (28) | / | src | / | Util | 
| File | Role | Description | 
|---|---|---|
|  ArrayHelper.php | Class | Class source | 
|  RuleHelper.php | Class | Class source | 
|  Files (28) | / | tests | 
| File | Role | Description | ||
|---|---|---|---|---|
|  unit (2 files) | ||||
|  _support (1 file) | ||||
|    coding_standard.xml | Data | Auxiliary data | ||
|    unit.suite.yml | Data | Auxiliary data | ||
|    _bootstrap.php | Aux. | Auxiliary script | ||
|  Files (28) | / | tests | / | unit | 
| File | Role | Description | 
|---|---|---|
|  MassSchematorTest.php | Class | Class source | 
|  SchematorTest.php | Class | Class source | 
| The PHP Classes site has supported package installation using the Composer tool since 2013, as you may verify by reading this instructions page. | 
|  Install with Composer | 
| Version Control | Unique User Downloads | Download Rankings | |||||||||||||||
| 100% | 
 | 
 | 
| Applications that use this package | 
 If you know an application of this package, send a message to the author to add a link here.
 If you know an application of this package, send a message to the author to add a link here.