Skip to content

Easily sort clothing size, height, bra size, furniture size and more

License

Notifications You must be signed in to change notification settings

TheDragonCode/size-sorter

Repository files navigation

Product Size Sorter

The Dragon Code Product size sorting

Stable Version Total Downloads Github Workflow Status License

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:

  1. Letter clothing size (XXS, XS, M, L, 2XL, etc.)
  2. Numerical size of clothes and shoes (9, 10, 44-46, 48, etc.)
  3. Bra size (70B, 75A, 80C, etc...)
  4. Overall dimensions of items (40x38x19 sm, etc.)
  5. Volumes (450 ml, 30 l, 450ml, 30l, etc.)
  6. 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:

  1. Letter clothing size (XXS, XS, M, L, 2XL, etc.)
  2. Numerical size of clothes and shoes (9, 10, 44-46, 48, etc.)
  3. Bra size (70B, 75A, 80C, etc...)
  4. Overall dimensions of items (40x38x19 sm, etc.)
  5. Volumes (450 ml, 30 l, 450ml, 30l, etc.)
  6. 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.

About

Easily sort clothing size, height, bra size, furniture size and more

Resources

License

Stars

Watchers

Forks

Sponsor this project

Contributors 5

Languages