对多维数组的键进行递归排序

发布于 2024-10-08 19:14:24 字数 1969 浏览 0 评论 0原文

我很难尝试对多维数组的键进行递归排序。我尝试使用 usort(),但没有成功。

示例数据:

[
    'first_level' => [
        'dir_3' => [
            'subdir_1' => [
                'file_2.mp4' => (object) [
                    'name' => 'file_2.mp4',
                ],
                'file_1.mp4' => (object) [
                    'name' => 'file_1.mp4',
                ],
            ],
        ],
        'dir_1' => [
            'subdir_2' => [
                'file_6.mp4' => (object) [
                    'name' => 'file_6.mp4',
                ],
                'file_9.mp4' => (object) [
                    'name' => 'file_9.mp4',
                ],
                'file_7.mp4' => (object) [
                    'name' => 'file_7.mp4',
                ],
            ],
            'subdir_1' => [
                'file_8.mp4' => (object) [
                    'name' => 'file_8.mp4',
                ],
            ],
        ],
    ],
]

期望结果:

[
    'first_level' => [
        'dir_1' => [
            'subdir_1' => [
                'file_8.mp4' => (object) [
                    'name' => 'file_8.mp4',
                ],
            ],
            'subdir_2' => [
                'file_6.mp4' => (object) [
                    'name' => 'file_6.mp4',
                ],
                'file_7.mp4' => (object) [
                    'name' => 'file_7.mp4',
                ],
                'file_9.mp4' => (object) [
                    'name' => 'file_9.mp4',
                ],
            ],
        ],
        'dir_3' => [
            'subdir_1' => [
                'file_1.mp4' => (object) [
                    'name' => 'file_1.mp4',
                ],
                'file_2.mp4' => (object) [
                    'name' => 'file_2.mp4',
                ],
            ],
        ],
    ],
]

I am having a hard time trying recursively sort a multidimensional array on its keys. I tried with usort(), but with no success.

Sample data:

[
    'first_level' => [
        'dir_3' => [
            'subdir_1' => [
                'file_2.mp4' => (object) [
                    'name' => 'file_2.mp4',
                ],
                'file_1.mp4' => (object) [
                    'name' => 'file_1.mp4',
                ],
            ],
        ],
        'dir_1' => [
            'subdir_2' => [
                'file_6.mp4' => (object) [
                    'name' => 'file_6.mp4',
                ],
                'file_9.mp4' => (object) [
                    'name' => 'file_9.mp4',
                ],
                'file_7.mp4' => (object) [
                    'name' => 'file_7.mp4',
                ],
            ],
            'subdir_1' => [
                'file_8.mp4' => (object) [
                    'name' => 'file_8.mp4',
                ],
            ],
        ],
    ],
]

Desired result:

[
    'first_level' => [
        'dir_1' => [
            'subdir_1' => [
                'file_8.mp4' => (object) [
                    'name' => 'file_8.mp4',
                ],
            ],
            'subdir_2' => [
                'file_6.mp4' => (object) [
                    'name' => 'file_6.mp4',
                ],
                'file_7.mp4' => (object) [
                    'name' => 'file_7.mp4',
                ],
                'file_9.mp4' => (object) [
                    'name' => 'file_9.mp4',
                ],
            ],
        ],
        'dir_3' => [
            'subdir_1' => [
                'file_1.mp4' => (object) [
                    'name' => 'file_1.mp4',
                ],
                'file_2.mp4' => (object) [
                    'name' => 'file_2.mp4',
                ],
            ],
        ],
    ],
]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

日裸衫吸 2024-10-15 19:14:24

使用递归函数在当前级别和所有更深的子数组上调用 ksort。

function recur_ksort(&$array) {
    foreach ($array as &$value) {
        if (is_array($value))
            recur_ksort($value);
     }
     ksort($array);
}

recur_ksort($array);
var_export($array);

演示:https://3v4l.org/Xede5

Use a recursive function to call ksort on the current level and all deeper subarrays.

function recur_ksort(&$array) {
    foreach ($array as &$value) {
        if (is_array($value))
            recur_ksort($value);
     }
     ksort($array);
}

recur_ksort($array);
var_export($array);

Demo: https://3v4l.org/Xede5

記柔刀 2024-10-15 19:14:24

您需要使用 ksort 进行递归。 演示

function recursive_ksort(&$array) {
    foreach ($array as &$v) {
        if (is_array($v)) {
            recursive_ksort($v);
        }
    }
    ksort($array);
}

recursive_ksort($array);
var_export($array);

You need to use ksort with recursion. Demo

function recursive_ksort(&$array) {
    foreach ($array as &$v) {
        if (is_array($v)) {
            recursive_ksort($v);
        }
    }
    ksort($array);
}

recursive_ksort($array);
var_export($array);
风尘浪孓 2024-10-15 19:14:24
function ksort_recursive(&$array)
{
    if (is_array($array)) {
        ksort($array);
        array_walk($array, 'ksort_recursive');
    }
}

在递归函数中没有必要返回 ksort()——无论如何,这都会从 ksort() 返回不需要的成功布尔值。

请注意,当给定非数组时,此函数不会抛出“警告:ksort() 期望参数 1 为数组”——这符合我的要求,但可能不符合您的要求。演示:https://3v4l.org/bogAU

function ksort_recursive(&$array)
{
    if (is_array($array)) {
        ksort($array);
        array_walk($array, 'ksort_recursive');
    }
}

It is not necessary within the recursive function to return ksort() -- this would return the unwanted success boolean value from ksort() anyhow.

Note that this function does not throw "Warning: ksort() expects parameter 1 to be array" when given a non-array - this matches my requirements but perhaps not yours. Demo: https://3v4l.org/bogAU

无人接听 2024-10-15 19:14:24

可以公平地假设您希望数据“自然”排序——这意味着目录和文件名的数字部分应该按数字排序,而不是简单的字符串排序。如果不自然排序,dir_10 会移到 dir_2 前面,因为比较两个字符串的第 5 个字符时,1 小于 2。

代码:(演示)

function nat_ksort_r(&$data): void
{
    if (is_array($data)) {
        ksort($data, SORT_NATURAL);
        array_walk($data, __METHOD__);
    }
}

nat_ksort_r($array);
var_export($array);
  • 对于自然排序,请将 SORT_NATURAL 标志应用于 ksort() 打电话。
  • 为了更简单地维护递归函数,请使用 __METHOD__ 魔术常量调用该函数。如果您希望将自定义函数调用为其他内容,这会减少一个需要更改 nat_ksort_r() 的地方。
  • 该递归函数不返回任何数据;它通过引用修改原始数组。
  • 最低级别包含对象,并且该数据不会按函数排序。

上面的函数还可以使用经典循环来代替函数迭代器。 (演示

function nat_ksort_r(&$data): void
{
    if (is_array($data)) {
        ksort($data, SORT_NATURAL);
        foreach ($data as &$item) {
            (__METHOD__)($item);
        }
    }
}

nat_ksort_r($array);
var_export($array);

您甚至可以以完全匿名的方式编写代码。 演示

$nat_ksort_r = function(&$data) use (&$nat_ksort_r) {
    if (is_array($data)) {
        ksort($data, SORT_NATURAL);
        foreach ($data as &$item) {
            $nat_ksort_r($item);
        }
    }
};
$nat_ksort_r($array);
var_export($array);

It is fair to assume that you'd like your data ti be sorted "naturally" -- meaning that the number portion of the directory and file names should be sorted numerically instead of as simple strings. Without sorting naturally, dir_10 will be moved in front of dir_2 because when comparing the 5th character of the two strings, 1 is less than 2.

Code: (Demo)

function nat_ksort_r(&$data): void
{
    if (is_array($data)) {
        ksort($data, SORT_NATURAL);
        array_walk($data, __METHOD__);
    }
}

nat_ksort_r($array);
var_export($array);
  • For natural sorting, apply the SORT_NATURAL flag to the ksort() call.
  • For simpler maintenance of the recursive function, recall the function using the __METHOD__ magic constant. This makes one less place to change nat_ksort_r() if you wish to call the custom function something else.
  • This recursive function does not return any data; it modifies the original array by reference.
  • The lowest level contains objects and this data does not get sorted by the function.

The above function can also use a classic loop instead of a functional iterator. (Demo)

function nat_ksort_r(&$data): void
{
    if (is_array($data)) {
        ksort($data, SORT_NATURAL);
        foreach ($data as &$item) {
            (__METHOD__)($item);
        }
    }
}

nat_ksort_r($array);
var_export($array);

You can even write the code in a completely anonymous fashion. Demo

$nat_ksort_r = function(&$data) use (&$nat_ksort_r) {
    if (is_array($data)) {
        ksort($data, SORT_NATURAL);
        foreach ($data as &$item) {
            $nat_ksort_r($item);
        }
    }
};
$nat_ksort_r($array);
var_export($array);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文