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"
根据完整代码更新答案
这里的第一个问题是你返回的结果是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)