我正在尝试按键名称(而不是值)对相当大的多维数组进行排序,但我也需要它尽可能快。
结果数组将转换为 JSON 并保存在文件中,因此如果有一种方法可以按键对 JSON 进行排序,这就是我所需要的。
我正在有效地尝试找到与 Python 相当的 PHP json.dumps(dict, sort_keys = True, indent = 4)
<- sort_keys 选项。
我试过uksort($array, 'strnatcasecmp');
,但这根本不起作用,我还尝试了一些其他“自定义”解决方案,但我尝试的都不够快速和优雅。
此外,谷歌搜索“PHP 按键/键名称深度排序多维数组”不会产生任何结果。最后标题中按键排序的每个问题都希望按特定键的值排序...
有什么简单快捷的方法可以做到这一点吗?
这是此类数组的一个简单示例
array(
'common' => array(
'zyu' => 'something',
'gka' => 'something',
'lfi' => 'something',
'abc' => 'something',
),
'data_result' => array(
'doc' => array(
66145 => array(
'lfk' => 'something',
'eks' => 'something',
'abc' => 'something'
),
34154 => array(
'lfk' => 'something',
'eks' => 'something',
'abc' => 'something'
)
),
'zus' => array(
// some data
),
'llo' => 'something',
'abc' => 'something'
),
'data_1' => array(
// Array with lots of values and another arrays inside
),
'post' => array(
'id' => 15525,
'time' => 156652363,
'something' => 'something'
)
);
这就是我需要得到的(如您所见,每个数组键都按字母顺序排序):
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,
)
);
我试图避免 foreach 循环和数组重复,因为数组非常大(生成的 JSON 文件有 5500 到 7000 行(有时甚至更多)),并且此操作会非常频繁地完成,并且我不想仅仅为了使 JSON 文件易于人类读取和调试而使服务器过载。
Ps.:我不会创建这些数组,其中大部分是从二进制文件中读取的,其中包含 JSON 格式的数组。我只是将它们组合到单个数组中并对它们执行一些操作(添加一些自定义值等),然后将其另存为 JSON。
如果有任何不清楚的地方(因为现在是凌晨 3:35,我还没有处于巅峰状态),请发表评论,如有必要,我会编辑我的问题。
感谢您的帮助。
最佳答案
编写一个递归函数调用 ksort
对于每个数组项:
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]);
}
}
}
关于php - 按键名对深度多维数组或生成的 JSON 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41318320/