数组以任何顺序到达时具有以下部分或全部值。按升序排序的最佳方式是什么?所以从小开始到以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”
答案 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_map
与anonymous function一起用于构建$arr
中每个值的“权重”数组。然后使用该数组对$arr
中的值进行排序。
这与基于已计算的“权重”的比较基本相同as BoltClock suggested。
答案 2 :(得分:1)
分两个阶段进行分类。首先,将文本转换为方便的数值。在这一刻,您应该决定“L”和“Large”是否映射到相同的值。然后根据这些数字转换对数组重新排序。