you should decode json to array, and then use usort to sort array:
$data = '{
"class": {
"type": "major",
"order": "1"
},
"number": {
"type": "date",
"order": "5"
},
"amount": {
"type": "date",
"order": "3"
}
}';
$array = json_decode($data, true);
usort($array, function ($left, $right) {
if ($left['order'] == $right['order']) {
return 0;
}
return $left['order'] < $right['order'] ? -1 : 1;
});
var_dump($array);
To guarantee stable sort, you need to index elements before sorting, and use that index while comparing "equal" elements. I also add some conditions to move elements with empty order to bottom (but with preserving change of it primary sequence):
$i = 0;
foreach ($array as $key => $value) {
$array[$key]['original_order'] = $i;
$i++;
}
uasort($array, function ($left, $right) {
if (isset($left['order'])) {
if(isset($right['order'])) {
if ($right['order'] == $left['order']) {
return $left['original_order'] < $right['original_order'] ? -1 : 1;
}
return $left['order'] < $right['order'] ? -1 : 1;
}
return -1;
} elseif(isset($right['order'])) {
return 1;
} else {
return $left['original_order'] < $right['original_order'] ? -1 : 1;
}
});
foreach ($array as $key => $value) {
unset($array[$key]['original_order']);
}