我目前正在使用以下自定义排序功能,以便按衣服尺寸进行排序:
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、XL与32、34、36、38值混合,则需要在数组$sizes
中定义所有可能的大小进行比较。此外,如果您不想定义所有数值(32,34,…),您可以创建关联数组:
$array = [
'32' => 'S',
'34' => 'M',
'36' => 'L',
];
然后array_search()
返回数字大小(当然,如果大小不是字母值,则需要编写条件),您可以将其与默认的数字大小进行比较。