我有这样的JSON:
{
"class": {
"type": "major",
"order": "1"
},
"number": {
"type": "date",
"order": "5"
},
"amount": {
"type": "date",
"order": "3"
},
}
我需要将其放入PHP数组并根据order
字段进行排序。
如果数字相同,则订单应保持原样。
编辑:
另外,如果某些元素没有,order
那么它们应该位于底部
您可以使用json_decode()
将其转换为PHP数组。然后,您需要编写一个稳定的实现usort()
以对值进行排序。像这样的东西:
function stableSort(array $array) {
// turn the input array into something we can more easily manipulate
$lookup = array();
$i = 0;
foreach($array as $key => $value) {
$lookup[] = array(
'position' => $i++,
'key' => $key,
'value' => $value);
}
usort($lookup, function(array $a, array $b) {
if(!isset($a['value']['order'])) {
if(!isset($b['value']['order'])) {
return $a['position'] > $b['position'];
}
return 1;
}
if(!isset($b['value']['order'])) {
return -1;
}
if($a['value']['order'] == $b['value']['order']) {
return $a['position'] > $b['position'];
}
return $a['value']['order'] > $b['value']['order'] ? 1 : -1;
});
// recreate the original array
$sorted = array();
foreach($lookup as $element) {
$sorted[$element['key']] = $element['value'];
}
return $sorted;
}
$array = json_decode($json, true);
$sorted = stableSort($array);
我们绝不从比较函数中返回0,因为那样会破坏对稳定排序的保证。前两个if
语句用于处理其中order
一个或两个输入中都不存在键的情况。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句