如何解决如何使用PHP和usort对JSON数据进行排序?
| 如何使用PHP对以下内容进行排序? (其中wed_2_open在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
}
从以前的答案看来,usort可能是一个答案,但是我收到错误消息,告诉我$ obj是对象而不是数组。
谢谢。
解决方法
几点注意事项:
要对“ 3”数据使用任何数组函数,必须将“ 4”作为第二个参数传递,它为您提供了关联数组而不是对象。
每当您打算对数组进行排序时,请查看此页面,该页面可帮助您决定应使用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_suffix);
return strcmp($a,$b);
}
注意:上面显示的我的“ 7”实现是幼稚的。即兴创作,如有必要。
, $array = $json_decode($json,true); //> tradyblix
ksort($array); //> Sort by keys
, 首先,您的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);
您可能已经按值对值进行了排序-不需要usort,除非您需要创建自定义比较函数,例如,比较对象的实例。
然后,您可以对此进行迭代和发射(添加转义和标记):
echo \"<ol>\\n\";
foreach($obj[\'hours\'] as $key => $val) {
echo \"\\t<li>\" . htmlentities($key) . \' => \' . htmlentities($val) . \"</li>\\n\";
}
echo \"</ol>\\n\";
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。