我如何使用PHP对以下内容进行排序? (wed_1_cln在wed_1_close之后出现)
我有以下JSON数据:
"hours": {
"mon_1_open": 406800,
"mon_1_close": 437400,
"tue_1_open": 493200,
"tue_1_close": 523800,
"wed_1_open": 579600,
"wed_1_close": 590400,
"thu_1_open": 61200,
"thu_1_close": 91800,
"fri_1_open": 147600,
"fri_1_close": 178200,
"sat_1_open": 237600,
"sat_1_close": 264600,
"sun_1_open": 324000,
"sun_1_close": 345600,
"wed_2_open": 597600,
"wed_2_close": 619200
}
然后我使用JSON_decode转换为可用的格式:
$obj=json_decode($json);
将其放入循环中以使用将其转换为HTML:
foreach ($obj->hours as $key => $val) {
// Turn array items into HTML list items
}
从previous answers来看,似乎usort可能是一个答案,但我得到错误告诉我$ obj是一个对象而不是一个数组。
感谢。
答案 0 :(得分:4)
很少注意到:
要在json_decode()
ed数据上使用任何数组函数,必须将true
作为第二个参数传递,它会为您提供关联数组而不是对象。
每当您计划对数组进行排序时,请查看this page,它可以帮助您确定应该使用的12个以上数组排序函数中的哪一个。
由于所需的排序不直观(按键排序将星期五放在顶部并在打开前关闭),您应该定义自定义排序功能;使用uksort()
允许你在数组键上执行此操作:
<?php
$data = json_decode('{"hours": {
"mon_1_open": 406800,
"mon_1_close": 437400,
"tue_1_open": 493200,
"tue_1_close": 523800,
"wed_1_open": 579600,
"wed_1_close": 590400,
"thu_1_open": 61200,
"thu_1_close": 91800,
"fri_1_open": 147600,
"fri_1_close": 178200,
"sat_1_open": 237600,
"sat_1_close": 264600,
"sun_1_open": 324000,
"sun_1_close": 345600,
"wed_2_open": 597600,
"wed_2_close": 619200
}}', true);
echo 'BEFORE ================================' . PHP_EOL;
print_r($data);
uksort($data['hours'], 'customsort');
echo 'AFTER ================================' . PHP_EOL;
print_r($data);
function customsort($a, $b) {
$tr_prefix = array(
'mon' => 1,
'tue' => 2,
'wed' => 3,
'thu' => 4,
'fri' => 5,
'sat' => 6,
'sun' => 7
);
$tr_suffix = array(
'open' => 1,
'close' => 2
);
$a = strtr(strtr($a, $tr_prefix), $tr_suffix);
$b = strtr(strtr($b, $tr_prefix), $tr_suffix);
return strcmp($a, $b);
}
注意:上面显示的customsort
实施方式不尽相同。必要时即兴发挥。
答案 1 :(得分:3)
$array = $json_decode($json,true); //> tradyblix
ksort($array); //> Sort by keys
答案 2 :(得分:2)
首先,你的json无效,因为你没有在包含'hours'的关联数组周围放置花括号。如果您为了简洁而将其删除,这可能不是问题,但我必须在调试时更改它。
更重要的是,您可以要求json_decode将数据转换为关联数组,而不是 stdClass 的实例。 ksort 然后允许您按键排序。
$json = file_get_contents('jsonsort.txt');
$obj = json_decode($json, true);
var_dump($obj);
ksort($obj['hours']);
var_dump($obj);
您可以使用 sort 按值排序 - 除非您需要创建自定义比较函数,比如比较对象的实例,否则不需要使用usort。
然后你可以用它来迭代和发射(添加了转义和标记):
echo "<ol>\n";
foreach($obj['hours'] as $key => $val) {
echo "\t<li>" . htmlentities($key) . ' => ' . htmlentities($val) . "</li>\n";
}
echo "</ol>\n";