PHP自定义排序数组

时间:2010-10-25 12:33:19

标签: php arrays sorting

数组以任何顺序到达时具有以下部分或全部值。按升序排序的最佳方式是什么?所以从小开始到以XXL结尾。我可以使用但是在我的用户定义函数

中如何排序元素有点遗失
Small
XXL
Medium
Large 
XL

编辑:遗漏了一些信息,因此创建了新问题Custom ordering array with key / value pairs

EDIT2:完整代码

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”

3 个答案:

答案 0 :(得分: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)];
}

旧答案

试试这个。如果您想要maintain key-value pairs

,请使用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
)

答案 1 :(得分: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_mapanonymous function一起用于构建$arr中每个值的“权重”数组。然后使用该数组对$arr中的值进行排序。

这与基于已计算的“权重”的比较基本相同as BoltClock suggested

答案 2 :(得分:1)

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