dragon-code / size-sorter
Easily sort clothing size, height, bra size, furniture size and more
Installs: 14 546
Dependents: 1
Suggesters: 0
Security: 0
Stars: 36
Watchers: 2
Forks: 1
Open Issues: 0
Requires
- php: ^8.2
- illuminate/collections: ^11.0 || ^12.0
Requires (Dev)
- dragon-code/codestyler: ^6.0
- fakerphp/faker: ^1.21
- illuminate/database: ^11.0 || ^12.0
- pestphp/pest: ^3.8
- symfony/var-dumper: ^7.0
README
Easily sort clothing size, height, bra size, furniture size and more
Installation
To get the latest version of Product Size Sorter
, simply require the project
using Composer:
composer require dragon-code/size-sorter
Or manually update require
block of composer.json
and run composer update.
{ "require": { "dragon-code/size-sorter": "^2.0" } }
Tip
When using the Laravel framework, make sure that its version is 11.0 or greater.
Usage
When calling a sort with common values, each element will be assigned to one of five groups:
- Letter clothing size (XXS, XS, M, L, 2XL, etc.)
- Numerical size of clothes and shoes (9, 10, 44-46, 48, etc.)
- Bra size (70B, 75A, 80C, etc...)
- Overall dimensions of items (40x38x19 sm, etc.)
- Volumes (450 ml, 30 l, 450ml, 30l, etc.)
- Other values
use DragonCode\SizeSorter\SizeSorter; return new SizeSorter([ 'XXL', '26', '28', 'XL', 'ONE SIZE', 'XXS', '2', '54', ])->sort(); /* * Returns: * * Illuminate\Support\Collection([ * 'XXS', * 'XL', * 'XXL', * '2', * '26', * '28', * '54', * 'ONE SIZE', * ]) */
use DragonCode\SizeSorter\SizeSorter; // Laravel models collection $items = Size::get(); return new SizeSorter($items) ->column('title') ->sort();
The static items
method is also available:
use DragonCode\SizeSorter\SizeSorter; return SizeSorter::items([ // ... ])->sort();
Groups Order
By default, sizes are sorted by the following logical blocks:
- Letter clothing size (XXS, XS, M, L, 2XL, etc.)
- Numerical size of clothes and shoes (9, 10, 44-46, 48, etc.)
- Bra size (70B, 75A, 80C, etc...)
- Overall dimensions of items (40x38x19 sm, etc.)
- Volumes (450 ml, 30 l, 450ml, 30l, etc.)
- Other values
But you can change the order by specifying identifiers as the third parameter:
use DragonCode\SizeSorter\Enum\Group; use DragonCode\SizeSorter\SizeSorter; return new SizeSorter($items) ->orderBy([ Group::BraSize, Group::OtherSizes, Group::OverallDimensions, Group::ClothesAndShoes, Group::VolumeGroup, Group::LetterClothingSize, ]) ->sort();
The final array will be formed in the specified order:
3 - 5 - 4 - 2 - 1
You can also specify some groups. For example:
use DragonCode\SizeSorter\Enum\Group; use DragonCode\SizeSorter\SizeSorter; return new SizeSorter($items) ->orderBy([ Group::BraSize, Group::OtherSizes, ]) ->sort();
In this case, the first two logical groups will be sorted in the specified order, and the subsequent ones will be in ascending order:
3 - 5 - 1 - 2 - 4
Custom Column
When working with an array of objects, you can specify which value can be used for sorting.
use DragonCode\SizeSorter\SizeSorter; return new SizeSorter($items) ->column('foo') ->sort();
You can also use "dotted" notation:
use DragonCode\SizeSorter\SizeSorter; $items = [ [ 'foo' => [ 'bar' => [ 'baz' => 'Some value', ] ] ] ]; return new SizeSorter($items) ->column('foo.bar.baz') ->sort();
And you can use the callback function in the same way:
use DragonCode\SizeSorter\SizeSorter; class Foo { public function __construct( public int $number, public string $value1, public string $value2, ) {} } $items = [ new Foo(1, 'first 1', 'first 2'), new Foo(2, 'second 1', 'second 2'), ]; return new SizeSorter($items) ->column(function (Foo $item) { return $item->number % 2 === 0 ? $item->value1 : $item->value2; }) ->sort();
And this is also possible:
use DragonCode\SizeSorter\SizeSorter; $items = [ ['foo' => 'XS'], ['foo' => '2XS'], ['foo' => '3XL'], ]; return new SizeSorter($items) ->column(function (array $item) { return match ($item['foo']) { '2XS' => 'XXS', '3XL' => 'XXXL', default => $item['foo'] }; }) ->sort();
Upgrade Guide
You can find the upgrade documentation here.
License
This package is licensed under the MIT License.