使用 uasort() 对平面数组进行自定义排序返回 1

问题描述 投票:0回答:3

数组到达时包含以下部分或全部值,顺序任意。按尺寸升序排列的最佳方式是什么?因此,从小号开始,以 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”

php arrays sorting associative-array custom-sort
3个回答
6
投票

根据完整代码更新了答案

这里的第一个问题是您要返回

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
)

3
投票

您可以使用

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 建议的基本相同,只是对已经计算出的“权重”进行比较。


1
投票
分两个阶段进行排序。首先,将文本转换为方便的数值。此时您应该决定“L”和“Large”是否映射到相同的值。然后根据这些数字转换对数组重新排序。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.