PHP中的自定义排序(按衣服尺寸)


Custom sort in PHP (by clothes sizes)

我目前正在使用以下自定义排序功能,以便按衣服尺寸进行排序:

function sort_size($a, $b) {
    static $sizes = array('STANDART', 'XXS', 'XS', 'S', 'M', 'L', 'XL', 'XXL', 'XXXL', 'XXXXL', 'XXXXXL');
    $asize = 100;
    $apos = -1;
    $bsize = 100;
    $bpos = -1;
    foreach($sizes AS $val => $str) {
        if(($pos = strpos($a, $str)) !== FALSE && ($apos < 0 || $pos < $apos)) {
            $asize = $val;
            $apos = $pos;
        }
        if(($pos = strpos($b, $str)) !== FALSE && ($bpos < 0 || $pos < $bpos)) {
            $bsize = $val;
            $bpos = $pos;
        }
    }
    return($asize == $bsize ? 0 : ($asize > $bsize ? 1 : -1));
}
usort($color, 'sort_color');

但我得到了以下结果:

S,M,L,XL,XXL,34,32,36,33,38,31,40

我如何修改它,以便对numbers进行排序?

function sort_color($a, $b) {
    $sizes = [ .... ];
    $av = array_search($a, $sizes);
    $bv = array_search ($b, $sizes);
    if($av === FALSE or $bv === FALSE)
       throw new InvalidArgumentException("Unknown size $a or $b");
    return $av - $bv;
}

尝试:

function sortBySizes($sizeA, $sizeB)
{
    $sizes = [32, 'S', 34, 'M', 36, 'L', 38, 'XL'];
    $keyForSizeA = array_search($sizeA, $sizes);
    $keyForSizeB = array_search($sizeB, $sizes);
    if ($keyForSizeA === $keyForSizeB) return 0;
    return ($keyForSizeA > $keyForSizeB) ? 1 : -1;
}
usort($clothes, "sortBySizes");

函数很简单,但如果需要将S、M、L、XL32、34、36、38值混合,则需要在数组$sizes中定义所有可能的大小进行比较。此外,如果您不想定义所有数值(32,34,…),您可以创建关联数组:

$array = [
    '32' => 'S',
    '34' => 'M',
    '36' => 'L',
];

然后array_search()返回数字大小(当然,如果大小不是字母值,则需要编写条件),您可以将其与默认的数字大小进行比较。