php - 按键名对深度多维数组或生成的 JSON 进行排序

标签 php arrays json sorting multidimensional-array

我正在尝试按键名称(而不是值)对相当大的多维数组进行排序,但我也需要它尽可能快。

结果数组将转换为 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/

相关文章:

php - 类似 jQuery Facebook 的评论系统

php - jQuery 和 Ajax 返回不同的数据集,而不是创建单独的 ajax 调用

在 C 中创建一个带有基本路径 + 扩展名和当前日期的文件名 [char *array]

java - 正确的用户输入与数组值不匹配

java - JSON - 在 Java 中使用 JSONArray 解析文档

php - 左连接中的总和计数错误

php - 如果 PHP 在 Linux 上运行;如何获取特定的发行版(Ubuntu、fedora 等)?

javascript - 按字符串属性值对对象数组进行排序

json - 如何根据 XML 架构 (XSD) 或 RelaxNG 验证 JSON?

python - Yajl 在 Python 中使用 githubarchive.org JSON 流解析错误