Php 按键名对深度多维数组或结果JSON排序
我试图按键名对一个相当大的多维数组进行排序(而不是值),但我也需要它尽可能快 生成的数组将转换为JSON并保存在一个文件中,所以如果有一种按键对JSON排序的方法,这就是我所需要的Php 按键名对深度多维数组或结果JSON排序,php,arrays,json,sorting,multidimensional-array,Php,Arrays,Json,Sorting,Multidimensional Array,我试图按键名对一个相当大的多维数组进行排序(而不是值),但我也需要它尽可能快 生成的数组将转换为JSON并保存在一个文件中,所以如果有一种按键对JSON排序的方法,这就是我所需要的 我正在有效地寻找与Python等价的PHPjson.dumps(dict,sort\u keys=True,indent=4)为每个数组项编写一个递归函数: function ksort_recursive(array &$a) { ksort($a, SORT_NATURAL | SORT_FLAG_C
我正在有效地寻找与Python等价的PHP
json.dumps(dict,sort\u keys=True,indent=4)
为每个数组项编写一个递归函数:
function ksort_recursive(array &$a) {
ksort($a, SORT_NATURAL | SORT_FLAG_CASE);
foreach ($a as $k => $v) {
if (is_array($v)) {
ksort_recursive($a[$k]);
}
}
}
谢谢,但这是我试图避免的,因为这个函数的执行需要+-0.01秒(从我的测试来看,通常大约是
0.009605884552秒
)和IMO,这是一个非常长的时间,而且我不确定它对CPU的负载有多大。这是唯一可能/最快的方法吗?您真的需要在服务器端使用它吗?如果只用于调试,那么考虑客户端上的排序,即在JavaScript中进行排序。总有更好的办法,但我找不到。总之,基本的快速排序算法是最好的。如果您真的需要在服务器端对数组进行排序,我能给出的最好建议是用C(PHP扩展)实现上述函数。这将消除PHP函数调用的开销。啊,如果有很多空数组,检查空数组将减少一些迭代:if(is_array($v)&&&v){ksort_recursive($a[$k])}
。可以使用RecursiveArrayIterator
实现这一点。它可能会节省一些内存,但我怀疑它会更快。这必须是服务器端,用PHP。用户上传一个反编译文件,服务器存储原始二进制文件和反编译的json文件(网站只使用json文件,但用户可以下载binray文件)。我需要它的排序,因为有时二进制文件可能会被奇怪地损坏,你必须手动通过反编译版本,并找到问题。此外,几乎没有空数组。对我来说,速度和服务器负载一样重要,但我不会建造火箭来节省0,01%的内存或获得1微秒。@MiChAeLoKGB,您可以存储未排序的JSON并为后台作业安排排序(通过crontab运行的脚本)。
array(
'common' => array(
'abc' => 'something',
'gka' => 'something',
'lfi' => 'something',
'zyu' => 'something',
),
'data_1' => array(
// Array with lots of values and another arrays inside
),
'data_result' => array(
'abc' => 'something'
'doc' => array(
34154 => array(
'abc' => 'something'
'eks' => 'something',
'lfk' => 'something',
)
66145 => array(
'abc' => 'something'
'eks' => 'something',
'lfk' => 'something',
),
),
'llo' => 'something',
'zus' => array(
// some data
),
),
'post' => array(
'id' => 15525,
'something' => 'something'
'time' => 156652363,
)
);
function ksort_recursive(array &$a) {
ksort($a, SORT_NATURAL | SORT_FLAG_CASE);
foreach ($a as $k => $v) {
if (is_array($v)) {
ksort_recursive($a[$k]);
}
}
}