PHP code example of free3_5man / laravel-macros
1. Go to this page and download the library: Download free3_5man/laravel-macros library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
free3_5man / laravel-macros example snippets
collect([1, 2, 3])->append(0); // [1, 2, 3, 0]
collect([
'First_name' => 'Adam',
'last-name' => 'Smith',
])->camelCaseKeys();
// [
// 'firstName' => "Adam",
// 'lastName' => "Smith",
// ]
$coll = collect([
'level1' => [
'level2' => [
'level3' => 'some data',
],
],
]);
$coll->dig('level2'); // ['level3' => 'some data']
$coll->dig('level3'); // 'some data'
$coll->dig('level4'); // null
collect([1, 2, 3])->equals([1, 2, 3]); // true
collect([1, 2, 3])->equals([1, 2 => 2, 3]); // false
collect([1, '1', true, 'null'])->ifAll(); // true
collect([2, 3, 4])->ifAll(function ($item) {
return $item > 1;
}); // true
collect([1, 2, 3, 4])->ifAll(function ($item) {
return $item > 1;
}); // false
collect([0, 1, 2])->ifAny(function ($item) {
return $item > 1;
}); // true
collect([0, 1])->ifAny(function ($item) {
return $item > 1;
}); // false
collect([0, '0', false, null, [], ''])->ifAny(); // false
collect([1, 2, 3, 1, 2, 3])->indexOfAll(1); // [0, 3]
collect(['1', 2, 3, 1, 2, 3])->indexOfAll(1, $strict = true); // [3]
collect([1, 2, 3])->indexOfAll(4); // []
collect([1, 2, 3])->initial(); // [1, 2]
collect([
'First_name' => 'Adam',
'lastName' => 'Smith',
])->kebabCaseKeys();
// [
// 'first-name' => "Adam",
// 'last-name' => "Smith",
// ]
collect([2, 1, 2, 5])->limit(2); // [2, 1]
collect([
'First_name' => 'Adam',
'lastName' => 'Smith',
])->lowerCaseKeys();
// [
// 'first_name' => "Adam",
// 'lastname' => "Smith",
// ]
collect([
[
'id' => 1,
'name' => 'Michael',
'age' => 18,
],
[
'id' => 2,
'name' => 'David',
'age' => 20,
],
[
'id' => 3,
'name' => 'James',
'age' => 22,
],
])->mapExcept(['age']);
// [
// [
// 'id' => 1,
// 'name' => 'Michael',
// ],
// [
// 'id' => 2,
// 'name' => 'David',
// ],
// [
// 'id' => 3,
// 'name' => 'James',
// ],
// ]
collect([
'First_name' => 'Adam',
'last-name' => 'Smith',
])->mapKeys(function($key) {
return Str::camel($key);
});
// [
// 'firstName' => "Adam",
// 'lastName' => "Smith",
// ]
collect([
[
'id' => 1,
'name' => 'Michael',
'age' => 18,
],
[
'id' => 2,
'name' => 'David',
'age' => 20,
],
[
'id' => 3,
'name' => 'James',
'age' => 22,
],
])->mapOnly(['id', 'name']);
// [
// [
// 'id' => 1,
// 'name' => 'Michael',
// ],
// [
// 'id' => 2,
// 'name' => 'David',
// ],
// [
// 'id' => 3,
// 'name' => 'James',
// ],
// ]
collect([
['id' => 1, 'comment_id' => null],
['id' => 2, 'comment_id' => 1],
['id' => 3, 'comment_id' => 1],
['id' => 4, 'comment_id' => 2],
['id' => 5, 'comment_id' => 4],
])->nest('comment_id');
// [
// [
// 'id' => 1,
// 'comment_id' => null,
// 'children' => [
// [
// 'id' => 2,
// 'comment_id' => 1,
// 'children' => [
// [
// 'id' => 4,
// 'comment_id' => 2,
// 'children' => [
// [
// 'id' => 5,
// 'comment_id' => 4,
// ],
// ],
// ],
// ],
// ],
// [
// 'id' => 3,
// 'comment_id' => 1,
// ],
// ],
// ]
// ]
collect([
['_id' => 1, 'comment_id' => null],
['_id' => 2, 'comment_id' => 1],
['_id' => 3, 'comment_id' => 1],
['_id' => 4, 'comment_id' => 2],
['_id' => 5, 'comment_id' => 4],
])->nest('comment_id', '_id');
// [
// [
// '_id' => 1,
// 'comment_id' => null,
// 'children' => [
// [
// '_id' => 2,
// 'comment_id' => 1,
// 'children' => [
// [
// '_id' => 4,
// 'comment_id' => 2,
// 'children' => [
// [
// '_id' => 5,
// 'comment_id' => 4,
// ],
// ],
// ],
// ],
// ],
// [
// '_id' => 3,
// 'comment_id' => 1,
// ],
// ],
// ]
// ]
collect([
['id' => 1, 'comment_id' => null],
['id' => 2, 'comment_id' => 1],
['id' => 3, 'comment_id' => 1],
['id' => 4, 'comment_id' => 2],
['id' => 5, 'comment_id' => 4],
])->nest('comment_id', 'id', 'child');
// [
// [
// 'id' => 1,
// 'comment_id' => null,
// 'child' => [
// [
// 'id' => 2,
// 'comment_id' => 1,
// 'child' => [
// [
// 'id' => 4,
// 'comment_id' => 2,
// 'child' => [
// [
// 'id' => 5,
// 'comment_id' => 4,
// ],
// ],
// ],
// ],
// ],
// [
// 'id' => 3,
// 'comment_id' => 1,
// ],
// ],
// ]
// ]
collect([
['id' => 1, 'comment_id' => null],
['id' => 2, 'comment_id' => 1],
['id' => 3, 'comment_id' => 1],
['id' => 4, 'comment_id' => 2],
['id' => 5, 'comment_id' => 4],
])->nest('comment_id', 'id', 'child', true);
// [
// [
// 'id' => 1,
// 'comment_id' => null,
// 'children' => [
// [
// 'id' => 2,
// 'comment_id' => 1,
// 'children' => [
// [
// 'id' => 4,
// 'comment_id' => 2,
// 'children' => [
// [
// 'id' => 5,
// 'comment_id' => 4,
// 'children' => [],
// ],
// ],
// ],
// ],
// ],
// [
// 'id' => 3,
// 'comment_id' => 1,
// 'children' => [],
// ],
// ],
// ]
// ]
collect([2, 1, 2, 5])->offset(1)->values(); // [1, 2, 5]
collect([
'First_name' => 'Adam',
'lastName' => 'Smith',
])->snakeCaseKeys();
// [
// 'first_name' => "Adam",
// 'last_name' => "Smith",
// ]
collect([
'A' => 'a',
'B' => 'b',
'C' => 'c',
'D' => 'd',
'E' => 'e',
])->sortKeysByKeysRanking([
'A' => 3,
'B' => 2,
'C' => 1,
'D' => 5,
'E' => 4,
]);
// [
// 'C' => 'c',
// 'B' => 'b',
// 'A' => 'a',
// 'E' => 'e',
// 'D' => 'd',
// ]
collect([1, 2, 3]); // [1, 2]
collect([['a', 'b'], ['c', 'd']])->toCSV(); // 'a,b\nc,d'
collect([['a', 'b'], ['c', 'd']])->toCSV(';'); // 'a;b\nc;d'
$coll = collect([
'First_name' => 'Adam',
'last-name' => 'Smith',
]);
$coll->transformKeys(function ($key) {
return Str::camel($key);
});
// $coll->dump();
// [
// 'firstName' => "Adam",
// 'lastName' => "Smith",
// ]
collect(["foo", "bar", "hello", "world"])->whereLike('o'); // ["foo", "hello", "world"]
collect([
['foo' => "hello"],
['foo' => "bar"],
['foo' => "world"],
])->whereLike('foo', 'o');
// [
// ['foo' => "hello"],
// ['foo' => "world"],
// ]
collect(["foo", "bar", "hello", "world"])->whereNotLike('o'); // ["bar"]
collect([
['foo' => "hello"],
['foo' => "bar"],
['foo' => "world"],
])->whereNotLike('foo', 'o'); // [['foo' => "bar"]]
collect(['a', 'b'])->zipWithKeys([1, 2]); // ['a' => 1, 'b' => 2]
collect(['a', 'b', 'c'])->zipWithKeys([1, 2]); // ['a' => 1, 'b' => 2, 'c' => null]
collect(['a', 'b'])->zipWithKeys([1, 2, 3]); // ['a' => 1, 'b' => 2]
// models
class User extends Model
{
protected $table = 'users';
public function getGenderZhCnAttribute()
{
return [
'male' => '男',
'female' => '女',
'unknown' => '未知',
][$this->gender];
}
}
// migrations
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
$table->softDeletes();
$table->string('name');
$table->date('birthday');
$table->integer('height');
$table->string('email')->nullable();
$table->string('gender');
});
Schema::create('articles', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
$table->softDeletes();
$table->string('title');
$table->text('content');
$table->integer('author_id');
});
// seeders
DB::table('users')->insert([
[
'name' => 'freeman',
'birthday' => '2020-01-01',
'height' => 175,
'email' => '[email protected] ',
'gender' => 'male',
],
[
'name' => 'michael',
'birthday' => '2020-02-01',
'height' => 185,
'email' => null,
'gender' => 'male',
],
[
'name' => 'david',
'birthday' => '2020-03-01',
'height' => 165,
'email' => null,
'gender' => 'male',
],
]);
factory(Article::class)->times(5)->create([
'author_id' => 1,
]);
factory(Article::class)->times(3)->create([
'author_id' => 2,
]);
factory(Article::class)->times(8)->create([
'author_id' => 3,
]);
DB::table('films')->insert([
[
'name' => 'Star Wars',
'start_time' => '2020-12-31 19:00:00',
'end_time' => '2020-12-31 22:00:00',
],
[
'name' => 'The Avengers 4',
'start_time' => '2020-12-31 21:30:00',
'end_time' => '2021-01-01 00:30:00',
],
[
'name' => 'Avatar',
'start_time' => '2021-01-01 01:00:00',
'end_time' => '2021-01-01 03:00:00',
],
]);
$users = User::all(['name', 'gender']);
// [
// [
// 'name' => 'freeman',
// 'gender' => 'male',
// ],
// [
// 'name' => 'michael',
// 'gender' => 'male',
// ],
// [
// 'name' => 'david',
// 'gender' => 'male',
// ],
// ]
$users->addAppends(['gender_zh_cn']);
// [
// [
// 'name' => 'freeman',
// 'gender' => 'male',
// 'gender_zh_cn' => '男',
// ],
// [
// 'name' => 'michael',
// 'gender' => 'male',
// 'gender_zh_cn' => '男',
// ],
// [
// 'name' => 'david',
// 'gender' => 'male',
// 'gender_zh_cn' => '男',
// ],
// ]
$users = User::all();
$users->addHidden(['id', 'birthday', 'email', 'gender', 'created_at', 'updated_at']);
// [
// [
// 'name' => 'freeman',
// 'height' => 175,
// ],
// [
// 'name' => 'michael',
// 'height' => 185,
// ],
// [
// 'name' => 'david',
// 'height' => 165,
// ],
// ]
$builder = User::query()->select([
'name',
]);
$builder->addSelectSub('sub_articles_count', Article::query()
->whereColumn('author_id', 'users.id')
->select(DB::raw('count(id)')))
->get();
// [
// [
// "name" => "freeman",
// "sub_articles_count" => "5",
// ],
// [
// "name" => "michael",
// "sub_articles_count" => "3",
// ],
// [
// "name" => "david",
// "sub_articles_count" => "8",
// ],
// ]
// if request field equals to db field
$whereFields = [
'users' => [
'name',
'birthday',
],
];
$data = [
'name' => 'michael',
'birthday' => '2020-02-01',
];
// the param '$data' retrieve request input default if not passed
User::query()->filter($whereFields, $useWhereIn = false, $data)->count(); // 1
// if request field doesn't equal to db field
$whereFields = [
'users' => [
'name' => 'name_field_in_request_query',
'birthday' => 'birthday_field_in_request_query',
],
];
$data = [
'name_field_in_request_query' => 'michael',
'birthday_field_in_request_query' => '2020-02-01',
];
// the param '$data' retrieve request input default if not passed
User::query()->filter($whereFields, $useWhereIn = false, $data)->count(); // 1
// use whereIn for each field
$whereFields = [
'users' => [
'name',
'birthday',
],
];
$data = [
'name' => [
'freeman',
'michael',
],
'birthday' => [
'2020-02-01',
],
];
// the param '$data' retrieve request input default if not passed
User::query()->filter($whereFields, $useWhereIn = true, $data)->count(); // 1
// if request field equals to db field
$whereFields = [
'users' => [
'height',
],
];
$data = [
'height_begin' => 170,
'height_end' => 180,
];
// the param '$data' retrieve request input default if not passed
User::query()->filterRange($whereFields, $useWhereDate = false, $data)->count(); // 1
// if request field doesn't equal to db field
$whereFields = [
'users' => [
'height' => 'height_field_in_request_query',
],
];
$data = [
'height_field_in_request_query_begin' => 170,
'height_field_in_request_query_end' => 180,
];
// the param '$data' retrieve request input default if not passed
User::query()->filterRange($whereFields, $useWhereDate = false, $data)->count(); // 1
// use whereDate for each field
$whereFields = [
'users' => [
'birthday',
],
];
$data = [
'birthday_begin' => '2020-01-15',
'birthday_end' => '2020-02-15',
];
// the param '$data' retrieve request input default if not passed
User::query()->filterRange($whereFields, $useWhereDate = true, $data)->count(); // 1
// specify the suffix to replace default _begin and _end
$whereFields = [
'users' => [
'birthday',
],
];
$data = [
'birthday_start' => '2020-01-15',
'birthday_finish' => '2020-02-15',
];
// the param '$data' retrieve request input default if not passed
$builder->filterRange($whereFields, $useWhereDate = true, $data, '_start', '_finish')->count(); // 1
// if request field equals to db field
$whereFields = [
'users' => [
'email',
],
];
$data = [
'email' => null,
];
// the param '$data' retrieve request input default if not passed
User::query()->filterWhereNull($whereFields, $data)->count(); // 2
// if request field doesn't equal to db field
$whereFields = [
'users' => [
'email' => 'email_field_in_request_query',
],
];
$data = [
'email_field_in_request_query' => null,
];
// the param '$data' retrieve request input default if not passed
$builder->filterWhereNull($whereFields, $data)->count(); // 2
Film::query()->overlaps('start_time', 'end_time', CarbonPeriod::create('2020-12-31 18:00:00', '2020-12-31 19:00:00'))->count(); // 0
Film::query()->overlaps('start_time', 'end_time', CarbonPeriod::create('2020-12-31 19:00:00', '2020-12-31 19:00:01'))->count(); // 1
Film::query()->overlaps('start_time', 'end_time', CarbonPeriod::create('2020-12-31 21:29:59', '2020-12-31 21:30:00'))->count(); // 1
Film::query()->overlaps('start_time', 'end_time', CarbonPeriod::create('2020-12-31 21:30:00', '2020-12-31 21:30:01'))->count(); // 2
Film::query()->overlaps('start_time', 'end_time', CarbonPeriod::create('2021-01-01 00:29:59', '2021-01-01 00:30:00'))->count(); // 1
Film::query()->overlaps('start_time', 'end_time', CarbonPeriod::create('2021-01-01 00:30:00', '2021-01-01 00:30:01'))->count(); // 0
Film::query()->overlaps('start_time', 'end_time', CarbonPeriod::create('2020-12-31 21:59:59', '2021-01-01 01:00:01'))->count(); // 3
User::query()->distinct()->select(['id', 'name'])->dumpSql();
// 'select distinct "id", "name" from "users" where "users"."deleted_at" is null'
// correct total when using distinct query
$paginator = User::query()->distinct()->enhancedPaginate(10, ['gender']);
$paginator->total(); // 3, the total maybe wrong when query using distinct
$builder = User::query()->distinct();
$total = $builder->count('gender'); // query the exact total here
$paginator = $builder->enhancedPaginate(10, ['gender'], null, $total);
$paginator->total(); // 1, the total here is correct
// do map with paginator but keep the data format as LengthAwarePaginator
$paginator = User::query()->enhancedPaginate(10, ['id', 'name', 'height'], function($user) {
// format height with cm
return $user->fill([
'height' => $user->height . ' cm',
]);
});
// Illuminate\Pagination\LengthAwarePaginator
// [
// "current_page" => 1,
// "data" => [
// [
// "id" => 1,
// "name" => "freeman",
// "height" => "175 cm",
// ],
// [
// "id" => 2,
// "name" => "michael",
// "height" => "185 cm",
// ],
// [
// "id" => 3,
// "name" => "david",
// "height" => "165 cm",
// ],
// ],
// "first_page_url" => "http://localhost?page=1",
// "from" => 1,
// "last_page" => 1,
// "last_page_url" => "http://localhost?page=1",
// "next_page_url" => null,
// "path" => "http://localhost",
// "per_page" => 10,
// "prev_page_url" => null,
// "to" => 3,
// "total" => 3,
// ]
User::query()->distinct()->select(['id', 'name'])->getFullSql();
// 'select distinct "id", "name" from "users" where "users"."deleted_at" is null'
Arr::buildQuery([
'per_page' => 10,
'page' => 1,
'a' => [
'b' => 'c',
],
'd' => ['e'],
]); // 'per_page=10&page=1&a%5Bb%5D=c&d%5B0%5D=e'
Arr::dotOnly([
'user' => [
'id' => 1,
'email' => '[email protected] ',
'password' => 'password1',
'profile' => [
'birthday' => '2000-01-01',
'gender' => 'male',
],
],
], [
'user.id',
'user.email',
'user.profile.birthday',
]);
// [
// "user" => [
// "id" => 1,
// "email" => "[email protected] ",
// "profile" => [
// "birthday" => "2000-01-01",
// ],
// ],
// ]
Arr::expand(['products.desk.price' => 100], '.'); // ['products' => ['desk' => ['price' => 100]]]
Arr::isAssoc(['a' => 2, 'b' => 3]); // true
Arr::isAssoc([2 => 'a', 3 => 'b']); // true
Arr::isAssoc(['a', 'b']); // false
Arr::isSub(['b', 'c'], ['a', 'b', 'c']); // true
Arr::isSub(['d'], ['a', 'b', 'c']); // false
Arr::parseQuery('per_page=10&page=1&a%5Bb%5D=c&d%5B0%5D=e');
// [
// 'per_page' => 10,
// 'page' => 1,
// 'a' => [
// 'b' => 'c',
// ],
// 'd' => ['e'],
// ]
Arr::range(5); // [0, 1, 2, 3, 4, 5]
Arr::range(7, 3); // [3, 4, 5, 6, 7]
Arr::range(9, 0, 2); // [0, 2, 4, 6, 8]
Arr::remove(['a', 'c', 'b'], 'c'); // ['a', 'b']
Arr::remove(['a', 'c', 'b'], ['a']); // ['c', 'b']
Arr::remove(['a', 'c', 'b'], ['a', 'b']); // ['c']
Arr::repeat(5, 2); // [2, 2, 2, 2, 2]
Arr::repeat(5, '2'); // ['2', '2', '2', '2', '2']
Arr::toObject(['a' => 'c']); // {'a': 'c'}
Arr::toObject(['a', 'c']); // null
Str::allWords('I love china!!!'); // ['I', 'love', 'china']
Str::allWords('python, javaScript & coffee first_name'); // ['python', 'javaScript', 'coffee', 'first_name']
Str::capitalize('foo bar'); // 'Foo bar'
Str::capitalize('hello world', true); // 'Hello World'
Str::chars('Hello'); //["H", "e", "l", "l", "o"]
Str::decapitalize(' Foo Bar '); // ' foo Bar '
Str::decapitalize(' HellO World', true); // ' hellO world'
$indexOfO = null;
Str::each('Hello', function ($char, $index) use(&$indexOfO) {
if($char == 'o')
$indexOfO = $index;
});
dump($indexOfO); // 4
Str::humanize(' capitalize dash-CamelCase_underscore trim '); // 'Capitalize dash camel case underscore trim'
Str::lines("This\nis a\nmultiline\nstring.\n"); // ['This', 'is a', 'multiline', 'string.', '']
Str::map('Hello', function ($char) {
return $char == 'o' ? 'O' : $char;
}); // 'HellO'
Str::mask('1234567890', 0, 6); // '******7890'
Str::mask('1234567890', 7, 3); // '1234567***'
Str::mask('1234567890', 4, 3, '$'); // '1234$$$890'
Str::reduce('123', function ($carry, $char) {
return $carry + $char;
}, 0); // 6
Str::repeat('foobar', 3); // 'foobarfoobarfoobar'
Str::reverse('foobar'); // 'raboof'
Str::swapCase('Hello'); // 'hELLO'
(new Carbon('2021-09-06'))->getNaturalWeeks();
// [
// ['2021-09-01', '2021-09-05'],
// ['2021-09-06', '2021-09-12'],
// ['2021-09-13', '2021-09-19'],
// ['2021-09-20', '2021-09-26'],
// ['2021-09-27', '2021-09-30'],
// ]
(new Carbon('2021-08'))->getNaturalWeeks();
// [
// ['2021-08-01', '2021-08-01'],
// ['2021-08-02', '2021-08-08'],
// ['2021-08-09', '2021-08-15'],
// ['2021-08-16', '2021-08-22'],
// ['2021-08-23', '2021-08-29'],
// ['2021-08-30', '2021-08-31'],
// ]
(new Carbon('2022-01'))->getNaturalWeeks();
// [
// ['2022-01-01', '2022-01-02'],
// ['2022-01-03', '2022-01-09'],
// ['2022-01-10', '2022-01-16'],
// ['2022-01-17', '2022-01-23'],
// ['2022-01-24', '2022-01-30'],
// ['2022-01-31', '2022-01-31'],
// ]
(new CarbonPeriod('2021-07-31', '2021-08-01'))->countWeeks(); // 1
(new CarbonPeriod('2021-08-01', '2021-08-01'))->countWeeks(); // 1
(new CarbonPeriod('2021-08-01', '2021-08-02'))->countWeeks(); // 2
(new CarbonPeriod('2021-08-02', '2021-08-01'))->countWeeks(); // 2
(new CarbonPeriod('2021-08-01', '2021-08-31'))->countWeeks(); // 6
(new CarbonPeriod('2021-09-01', '2021-09-30'))->countWeeks(); // 5
(new CarbonPeriod('2021-12-31', '2022-01-01'))->countWeeks(); // 1
(new CarbonPeriod('2021-12-31', '2022-01-03'))->countWeeks(); // 2
getDateTimeString(new DateTime('2020-01-02 03:06:58')); // '2020-01-02 03:06:58'
getDateTimeString(new Carbon('2020-01-02 03:06:58')); // '2020-01-02 03:06:58'
getDateTimeString('2020-01-02 03:06:58'); // '2020-01-02 03:06:58'
getDateTimeString('2020-01-02 03:06:58', 'Y-m-d'); // '2020-01-02'
getDateTimeString(123); // null
getDateTimeString(null); // null
getTimestamp(new DateTime('2020-01-02 03:06:58')); // 1577934418
getTimestamp(new Carbon('2020-01-02 03:06:58')); // 1577934418
getTimestamp('2020-01-02 03:06:58'); // 1577934418
getTimestamp(123); // null
getTimestamp(null); // null
$assoc1 = $assoc2 = [
'a' => new DateTime('2020-01-02 03:06:58'),
'b' => new Carbon('2020-01-02 03:06:58'),
'c' => '2020-01-02 03:06:58',
'd' => null,
'e' => [
'f' => '2020-01',
'g' => '2020-01-01',
],
'h' => 'milan',
];
formatDateTimeAssoc($assoc1, ['a', 'b', 'c', 'd', 'e.f', 'e.g'], 'Y-m-d H:i');
dump($assoc1);
// [
// 'a' => '2020-01-02 03:06',
// 'b' => '2020-01-02 03:06',
// 'c' => '2020-01-02 03:06',
// 'd' => null,
// 'e' => [
// 'f' => '2020-01-01 00:00',
// 'g' => '2020-01-01 00:00',
// ],
// 'h' => 'milan',
// ]
formatDateTimeAssoc($assoc2, ['a', 'b', 'c', 'd'], 'timestamp');
dump($assoc2);
// [
// 'a' => 1577934418,
// 'b' => 1577934418,
// 'c' => 1577934418,
// 'd' => null,
// 'e' => [
// 'f' => '2020-01',
// 'g' => '2020-01-01',
// ],
// 'h' => 'milan',
// ]