PHP自定义排序数组

PHP自定义排序数组,php,arrays,sorting,Php,Arrays,Sorting,数组以任意顺序包含以下部分或全部值。按升序排列的最好方法是什么?所以从小开始,以XXL结束。我可以使用排序,但对于在用户定义的函数中应该如何排序元素,我有点不知所措 Small XXL Medium Large XL 编辑:遗漏了一些信息,因此创建了新问题 EDIT2:完整代码 print_r($sizes); $sorted_sizes = $this->sort_sizes(array_unique($sizes)); print_r($sorted_sizes); functi

数组以任意顺序包含以下部分或全部值。按升序排列的最好方法是什么?所以从小开始,以XXL结束。我可以使用排序,但对于在用户定义的函数中应该如何排序元素,我有点不知所措

Small
XXL
Medium
Large 
XL
编辑:遗漏了一些信息,因此创建了新问题

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_size)只给出输出“1”

根据完整代码更新的答案

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

这是错误的,因为
uasort()
不返回已排序的数组。它修改作为参数传递的同一变量,并返回布尔值。这就是为什么将
1
视为输出

通过引用使方法接受
$size

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)];
}

旧答案

试试这个。如果您想:

输出:

Array
(
    [0] => Small
    [1] => XXL
    [2] => Medium
    [3] => Large
    [4] => XL
)
Array
(
    [0] => Small
    [2] => Medium
    [3] => Large
    [4] => XL
    [1] => XXL
)

根据完整代码更新答案

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

这是错误的,因为
uasort()
不返回已排序的数组。它修改作为参数传递的同一变量,并返回布尔值。这就是为什么将
1
视为输出

通过引用使方法接受
$size

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)];
}

旧答案

试试这个。如果您想:

输出:

Array
(
    [0] => Small
    [1] => XXL
    [2] => Medium
    [3] => Large
    [4] => XL
)
Array
(
    [0] => Small
    [2] => Medium
    [3] => Large
    [4] => XL
    [1] => XXL
)

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

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

您可以使用以下方法进行此操作:

此处与用于构建
$arr
中每个值的“权重”数组。然后使用该数组对
$arr
中的值进行排序

这与对已计算的“权重”进行比较基本相同。

您可以使用:

此处与用于构建
$arr
中每个值的“权重”数组。然后使用该数组对
$arr
中的值进行排序


这与对已计算的“权重”进行比较基本相同。

对于关联数组,您可能希望使用
uasort
。例如:如何在usort中调用sort_size($arr,“sort_size”);如果这些是类中的方法?通常我通过$this->sort\u size调用函数,但如果我将其作为一个不带引号的参数传递,我会得到一个未定义的属性:Products:$sort\u size\u do error@stef:而不是
usort($arr,'sort\u size')
,do
usort($arr,array($this,'sort_size'))好,太好了。我要问第二个问题,因为输入数组实际上有键/值对,需要维护它们之间的关系@stef:codaddict的评论已经回答了这个问题:使用
uasort()
而不是
usort()
。如果是关联数组,您可能需要使用
uasort
。例如:如何在usort中调用sort_size($arr,“sort_size”);如果这些是类中的方法?通常我通过$this->sort\u size调用函数,但如果我将其作为一个不带引号的参数传递,我会得到一个未定义的属性:Products:$sort\u size\u do error@stef:而不是
usort($arr,'sort\u size')
,do
usort($arr,array($this,'sort_size'))好,太好了。我要问第二个问题,因为输入数组实际上有键/值对,需要维护它们之间的关系@stef:codaddict的评论已经回答了这个问题:使用
uasort()
而不是
usort()