PHP自定义排序数组

ste*_*tef 1 php arrays sorting

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

Small
XXL
Medium
Large 
XL
Run Code Online (Sandbox Code Playgroud)

编辑:遗漏了一些信息,因此创建了新问题自定义排序数组与键/值对

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];
}
Run Code Online (Sandbox Code Playgroud)

这输出:

Array
(
    [66-507cddcd16d9786abafccfa78b19acf8] => XL
    [64-507cddcd16d9786abafccfa78b19acf8] => medium
    [65-507cddcd16d9786abafccfa78b19acf8] => large
    [63-507cddcd16d9786abafccfa78b19acf8] => small
)
Run Code Online (Sandbox Code Playgroud)

和print_r($ sorted_sizes)只输出"1"

Bol*_*ock 6

根据完整代码更新答案

这里的第一个问题是你返回的结果是uasort():

function sort_sizes($sizes)
{
    return uasort($sizes, array($this, 'cmp'));
}
Run Code Online (Sandbox Code Playgroud)

那是错的,因为uasort()没有返回排序的数组.它修改您作为参数传递的相同变量,并返回一个布尔值.这就是你1看作输出的原因.

$sizes通过引用使方法接受:

function sort_sizes(array &$sizes)
{
    uasort($sizes, array($this, 'cmp'));
}
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

print_r($sizes);
$sorted_sizes = array_unique($sizes);
$this->sort_sizes($sorted_sizes);
print_r($sorted_sizes);
Run Code Online (Sandbox Code Playgroud)

这是您的cmp()方法,增加了对不区分大小写的排序的支持:

function cmp($a, $b)
{
    $sizes = array('small' => 0, 'medium' => 1, 'large' => 2, 'xl' => 3, 'xxl' => 4);
    return $sizes[strtolower($a)] - $sizes[strtolower($b)];
}
Run Code Online (Sandbox Code Playgroud)

老答案

试试这个.使用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
Run Code Online (Sandbox Code Playgroud)

输出:

Array
(
    [0] => Small
    [1] => XXL
    [2] => Medium
    [3] => Large
    [4] => XL
)
Array
(
    [0] => Small
    [2] => Medium
    [3] => Large
    [4] => XL
    [1] => XXL
)
Run Code Online (Sandbox Code Playgroud)