提问人:Jackom 提问时间:10/23/2023 最后编辑:mickmackusaJackom 更新时间:10/25/2023 访问量:95
自定义排序值后缀表示大小(XXS、XS、S、M、L、XL、XXL)
Custom sort on value suffix representing sizes (XXS, XS, S, M, L, XL, XXL)
问:
我正在尝试按大小对数组值进行排序,但我遇到了问题。 我的数组提取出的值与用于排序的“cmp”函数的值不同。 代码是这样的:
function cmp($a, $b)
{
$sizes = array(
"XXS" => 0,
"XS" => 1,
"S" => 2,
"M" => 3,
"L" => 4,
"XL" => 5,
"XXL" => 6,
);
$asize = $sizes[$a];
$bsize = $sizes[$b];
if ($asize == $bsize) {
return 0;
}
return ($asize > $bsize) ? 1 : -1;
}
$your_array = array("GL001_XXL", "GL001_L", "GL001_XXS", "GL001_S");
usort($your_array, "cmp");
当我尝试运行此代码时,它告诉我“未定义的密钥”。
如何对数组进行排序而不会出错?
答:
4赞
Chris Haas
10/23/2023
#1
正如评论中所指出的,如果你的模式是真的,你可以爆炸并抓住第二项。xxx_size
_
只要你有“return 0、1 或 -1”模式,也可以使用。<=>
function sort_array_item_by_size($a, $b): int
{
static $sizes = [
"XXS" => 0,
"XS" => 1,
"S" => 2,
"M" => 3,
"L" => 4,
"XL" => 5,
"XXL" => 6,
];
// The next three lines really should include some error checking
$size_a = explode("_", $a)[1];
$size_b = explode("_", $b)[1];
return $sizes[$size_a] <=> $sizes[$size_b];
}
$your_array = ["GL001_XXL", "GL001_L", "GL001_XXS", "GL001_S"];
usort($your_array, "sort_array_item_by_size");
print_r($your_array);
// Array
// (
// [0] => GL001_XXS
// [1] => GL001_S
// [2] => GL001_L
// [3] => GL001_XXL
// )
评论
0赞
Jackom
10/24/2023
最后一个问题:如果我从foreach为“静态$sizes”创建一个数组,我该怎么办?再次感谢
0赞
Chris Haas
10/24/2023
@Jackom,我不确定你这是什么意思?
0赞
Jackom
10/24/2023
我向你解释,我希望 $ Sizes 的价值来自 Foreach。这是示例:“静态$sizes = $getArrayFromForeach;”。我该怎么办?我的 Foreach 应该如何为 $sizes 变量创建正确的数组?
0赞
Chris Haas
10/24/2023
你是说这样?3v4l.org/1c9Cp
0赞
mickmackusa
10/25/2023
#2
我建议不要用于此任务,因为这涉及每次迭代(超过 N 次)解析两个字符串。usort()
相反,它将更具性能并且使用起来非常简洁。由于输入字符串似乎始终用零填充,因此您可以通过从第 6 个字符偏移量开始抓取子字符串来简单地解析字符串。array_multisort()
代码:(演示)
define('SIZES', array_flip(['XXS', 'XS', 'S', 'M', 'L', 'XL', 'XXL']));
$array = ["GL001_XXL", "GL001_L", "GL001_XXS", "GL001_S"];
array_multisort(
array_map(fn($v) => SIZES[substr($v, 6)], $array),
$array
);
var_export($array);
这种方法将通过对整个字符串执行自然比较来产生中断联系(相同大小值)的额外效果。
评论
$your_array
$sizes
nnn_size
explode
_