PHP自定义排序数组
数组以任意顺序包含以下部分或全部值。按升序排列的最好方法是什么?所以从小开始,以XXL结束。我可以使用排序,但对于在用户定义的函数中应该如何排序元素,我有点不知所措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
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')
,dousort($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')
,dousort($arr,array($this,'sort_size'))代码>好,太好了。我要问第二个问题,因为输入数组实际上有键/值对,需要维护它们之间的关系@stef:codaddict的评论已经回答了这个问题:使用uasort()
而不是usort()
。