数组到达时包含以下部分或全部值,顺序任意。按尺寸升序排列的最佳方式是什么?因此,从小号开始,以 XXL 号结束。我可以进行排序,但对于如何在用户定义的函数中对元素进行排序有点迷失
Small
XXL
Medium
Large
XL
编辑:遗漏了一些信息,因此创建了新问题带有键/值对的自定义排序数组
编辑2:完整代码
print_r($sizes);
$sorted_sizes = $this->sort_sizes(array_unique($sizes));
print_r($sorted_sizes);
function sort_sizes($sizes)
{
return uasort($sizes, array($this, 'cmp'));
}
function cmp($a,$b)
{
$sizeArray = array( 'Small' => 0, 'Medium' => 1, 'Large' => 2, 'XL' => 3, 'XXL' => 4);
return $sizeArray[$a] - $sizeArray[$b];
}
输出:
Array
(
[66-507cddcd16d9786abafccfa78b19acf8] => XL
[64-507cddcd16d9786abafccfa78b19acf8] => medium
[65-507cddcd16d9786abafccfa78b19acf8] => large
[63-507cddcd16d9786abafccfa78b19acf8] => small
)
并且 print_r($sorted_sizes) 只给出输出“1”
根据完整代码更新了答案
这里的第一个问题是您要返回
uasort()
: 的结果
function sort_sizes($sizes)
{
return uasort($sizes, array($this, 'cmp'));
}
这是错误的,因为
uasort()
不返回排序后的数组。它修改作为参数传递的同一变量,并返回一个布尔值。这就是为什么您看到 1
作为输出。
通过引用使方法接受
$sizes
:
function sort_sizes(array &$sizes)
{
uasort($sizes, array($this, 'cmp'));
}
然后这样称呼它:
print_r($sizes);
$sorted_sizes = array_unique($sizes);
$this->sort_sizes($sorted_sizes);
print_r($sorted_sizes);
这是您的
cmp()
方法,增加了对不区分大小写排序的支持:
function cmp($a, $b)
{
$sizes = array('small' => 0, 'medium' => 1, 'large' => 2, 'xl' => 3, 'xxl' => 4);
return $sizes[strtolower($a)] - $sizes[strtolower($b)];
}
旧答案
试试这个。如果您想
维护键值对,请使用
uasort()
:
function sort_sizes($a, $b) {
// Map the sizes to an ordered sequence of ints
static $sizes = array('small' => 0, 'medium' => 1, 'large' => 2, 'xl' => 3, 'xxl' => 4);
// Find the difference, using the sizes as keys to the above array
return $sizes[strtolower($a)] - $sizes[strtolower($b)];
}
$arr = array('Small', 'XXL', 'Medium', 'Large', 'XL');
print_r($arr); // Before sorting
uasort($arr, 'sort_sizes');
print_r($arr); // After sorting
输出:
Array
(
[0] => Small
[1] => XXL
[2] => Medium
[3] => Large
[4] => XL
)
Array
(
[0] => Small
[2] => Medium
[3] => Large
[4] => XL
[1] => XXL
)
array_multisort
来完成此操作:
$orderIndex = array_flip(array('Small','Medium','Large','XL','XXL'));
$arr = array('Small','XXL','Medium','Large','XL');
array_multisort(array_map(function($val) use ($orderIndex) { return $orderIndex[$val]; }, $arr), $arr);
array_map
与匿名函数一起使用来构建$arr
中每个值的“权重”数组。然后使用该数组对 $arr
中的值进行排序。
这与 BoltClock 建议的基本相同,只是对已经计算出的“权重”进行比较。