自定义排序值后缀表示大小(XXS、XS、S、M、L、XL、XXL)

Custom sort on value suffix representing sizes (XXS, XS, S, M, L, XL, XXL)

提问人:Jackom 提问时间:10/23/2023 最后编辑:mickmackusaJackom 更新时间:10/25/2023 访问量:95

问:

我正在尝试按大小对数组值进行排序,但我遇到了问题。 我的数组提取出的值与用于排序的“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");

当我尝试运行此代码时,它告诉我“未定义的密钥”。

如何对数组进行排序而不会出错?

php 数组 usort 后缀 custom-sort

评论

1赞 AymDev 10/23/2023
这回答了你的问题吗?参考 - 这个错误在PHP中是什么意思?
0赞 AymDev 10/23/2023
中的值与 中的值不匹配。$your_array$sizes
0赞 Jackom 10/23/2023
是的,我明白。事实上,我想知道如何通过首先放置那些具有特定字符(如 XS、S 等)的数组来对数组进行排序......?谢谢
0赞 Chris Haas 10/23/2023
如果你的模式是 ,那么你可能可以继续并抓住比较中的第二项nnn_sizeexplode_
0赞 timchessish 10/23/2023
您可以使用 array_pop(explode('_', $a)) 从 $a 和 $b 中获取大小,但请务必处理此大小不在您的数组中的情况。

答:

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
// )

演示:https://3v4l.org/Dqfi6

评论

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);

这种方法将通过对整个字符串执行自然比较来产生中断联系(相同大小值)的额外效果。