我正在尝试按键对数组(包括字母键和数字键)进行排序,其中字母键将首先按字母顺序出现,然后按数字顺序出现。
尝试ksort
并使用所有可用的标志,但这无济于事。尝试了几个SO答案,但是没有一个达到我的目的。这是我拥有的数组的示例。
$array = array(
'Bat' => array(),
'Dog' => array(),
'Apple' => array(),
'Cat' => array(),
1 => array(),
3 => array(),
2 => array(),
4 => array()
);
我需要对它进行排序:
$array = array(
'Apple' => array(),
'Bat' => array(),
'Cat' => array(),
'Dog' => array(),
0 => array(),
1 => array(),
2 => array(),
3 => array()
);
我从一个SO答案中了解到,它可能需要一个自定义函数才能使用usort
函数进行排序。那就是我迷路的地方。任何帮助或指导正确的方向将不胜感激。
谢谢
答案 0 :(得分:3)
如果仅使用英文字母和数字,则通常的ksort函数可以正常工作
df = pd.DataFrame( {'Borough':['MANHATTAN','BROOKLYN','BROOKLYN','QUEENS','QUEENS','BROOKLYN','MANHATTAN','MANHATTAN','MANHATTAN']})
df['Borough'].value_counts(dropna=False).plot(kind='bar')
plt.show()
答案 1 :(得分:2)
请不要介意这个问题。我已经使用自定义功能管理实现bu。如果有人遇到此问题,我将在此处发布答案以提供帮助。
function ev_sort_array( $array ) {
$alp = array();
$num = array();
foreach ( $array as $key => $value ) {
if ( is_numeric($key) ) {
$num[$key] = $value;
} else {
$alp[$key] = $value;
}
}
ksort( $alp );
ksort( $num );
return array_merge( $alp, $num );
}
谢谢
答案 2 :(得分:2)
您可以通过以下方式使用uksort:
$array = array(
'Bat' => array(),
'Dog' => array(),
'Apple' => array(),
'Cat' => array(),
1 => array(),
3 => array(),
2 => array(),
4 => array()
);
uksort($array,function($a,$b){
if(is_int($a)&&is_int($b)) return $a-$b;
if(is_int($a)&&!is_int($b)) return 1;
if(!is_int($a)&&is_int($b)) return -1;
return strnatcasecmp($a,$b);
});
print_r($array);
输出符合预期:
Array
(
[Apple] => Array
(
)
[Bat] => Array
(
)
[Cat] => Array
(
)
[Dog] => Array
(
)
[1] => Array
(
)
[2] => Array
(
)
[3] => Array
(
)
[4] => Array
(
)
)
答案 3 :(得分:2)
如@ splash58所述,ksort()就足够了。
也就是说,如果您的项目数据是按字母顺序对数字数据进行排序,那么您需要颠倒这些组的顺序...
uksort()是这项工作最直接/最合适的功能。
*请仔细选择关键评估功能:
true
的内容进行了广泛定义-请参见手册。"1"
这样的字符串键的求值为false
。8
这样的非字符串键的计算结果为false
。您的排序逻辑说:在将数字与非数字进行比较时,请反转默认的排序结果。
如果您使用的是php7,则可以充分利用spaceship operator(<=>
)。如果您的php版本低于7,则可以使用任何喜欢的旧版本比较。
当两个值都是数字或两个值都是非数字时,我的解决方案允许飞船操作员订购ASC。当一个是数字而另一个不是数字时,请颠倒$a
和$b
的位置以进行DESC排序。
代码:(Demo)
$array = [
2 => [],
'Bat' => [],
'Dog' => [],
'Cat' => [],
1 => [],
3 => [],
'Apple' => [],
4 => []
];
uksort($array, function ($a, $b){
return is_int($a) != is_int($b) ? $b <=> $a : $a <=> $b;
});
var_export($array);
输出:(是的,我意识到这不是所需的输出,但这是有条件地反转排序顺序的所需技术。)
array (
1 =>
array (
),
2 =>
array (
),
3 =>
array (
),
4 =>
array (
),
'Apple' =>
array (
),
'Bat' =>
array (
),
'Cat' =>
array (
),
'Dog' =>
array (
),
)