Easily sort clothing size, height, bra size, furniture size and more
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.
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();
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
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();
You can find the upgrade documentation here.
This package is licensed under the MIT License.