PHP数组按尺寸后缀排序出现Undefined key错误,求解决方法
解决带前缀尺寸标识的数组排序问题
问题核心是你直接将完整的带前缀字符串(如GL001_XXL)作为尺寸映射数组的键,而映射数组的键只有纯尺寸(如XXL),导致找不到对应键报错。只需在比较前提取每个元素里的尺寸部分即可。
修改后的代码
function cmp($a, $b) { $sizes = array( "XXS" => 0, "XS" => 1, "S" => 2, "M" => 3, "L" => 4, "XL" => 5, "XXL" => 6, ); // 提取下划线后的尺寸部分 $aSizePart = explode('_', $a)[1]; $bSizePart = explode('_', $b)[1]; $asize = $sizes[$aSizePart]; $bsize = $sizes[$bSizePart]; 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"); // 验证排序结果 print_r($your_array);
额外容错优化
如果数组中存在格式不规范的元素(比如没有下划线),可以添加容错逻辑避免报错,同时将异常元素放到排序末尾:
function cmp($a, $b) { $sizes = array( "XXS" => 0, "XS" => 1, "S" => 2, "M" => 3, "L" => 4, "XL" => 5, "XXL" => 6, ); // 提取尺寸部分并做格式校验 $aParts = explode('_', $a); $aSizePart = isset($aParts[1]) ? $aParts[1] : ''; $bParts = explode('_', $b); $bSizePart = isset($bParts[1]) ? $bParts[1] : ''; // 处理不存在的尺寸,默认设为最大值放到末尾 $asize = isset($sizes[$aSizePart]) ? $sizes[$aSizePart] : PHP_INT_MAX; $bsize = isset($sizes[$bSizePart]) ? $sizes[$bSizePart] : PHP_INT_MAX; if ($asize == $bsize) { return 0; } return ($asize > $bsize) ? 1 : -1; }
内容的提问来源于stack exchange,提问作者Jackom
相关产品推荐
相关产品推荐

