意外的php usort结果

意外的php usort结果,php,arrays,compare,usort,Php,Arrays,Compare,Usort,我有一个包含文件的数组。我想按它们的最小值对它们进行排序(我将在下面解释) 这是阵列的一个示例: $files = array( array( 'name' => "DevTools/tools/files/design/js/custom/http_build_query.js", 'range' => array( 'min' => 0 ) ), array(

我有一个包含文件的数组。我想按它们的最小值对它们进行排序(我将在下面解释)

这是阵列的一个示例:

$files = array(
    array(
        'name' => "DevTools/tools/files/design/js/custom/http_build_query.js",
        'range' => array(
            'min' => 0
        )
    ),
    array(
        'name' => "DevTools/tools/files/design/js/custom/Form.js",
        'range' => array(
            'min' => 0
        )
    ),
    array(
        'name' => "DevTools/tools/files/design/js/custom/VanillaJS.js",
        'range' => array(
            'min' => 0
        )
    ),
    array(
        'name' => "resources/js/plugins/jquery.js"
    ),
    array(
        'name' => "resources/js/plugins/jquery-ui.js"
    ),
    array(
        'name' => "resources/js/plugins/popper.js"
    ),
    array(
        'name' => "resources/js/plugins/bootstrap-v4/index.js",
        'range' => array(
            'min' => 800
        )
    ),
    array(
        'name' => "resources/js/plugins/bootstrap-v4/util.js",
        'range' => array(
            'min' => 0
        )
    ),
    array(
        'name' => "resources/js/plugins/bootstrap-v4/dropdown.js",
        'range' => array(
            'min' => 200
        )
    ),
    array(
        'name' => "resources/js/plugins/bootstrap-v4/collapse.js",
        'range' => array(
            'min' => 0
        )
    ),
    array(
        'name' => "resources/js/custom/global.js"
    ),
    array(
        'name' => "layouts/cms/.js/+0.js",
        'range' => array(
            'min' => 0
        )
    ),
    array(
        'name' => "resources/js/plugins/module/delete.js"
    ),
    array(
        'name' => "resources/js/plugins/module/form.submit.js"
    ),
    array(
        'name' => "resources/js/plugins/module/piece.image.js"
    ),
    array(
        'name' => "resources/js/plugins/select2.js"
    )
);
这很容易理解。我们有所有文件的名称。其中一些具有[范围][min]

我需要做的是保持它们的顺序,但是只对同一文件夹中具有[range][min]的文件进行排序,所以我们按[min]对这些文件重新排序

我的代码 所以我使用这个函数:

usort($files, function (array $a, array $b) {
    if (!isset($a['range']) || !isset($b['range'])
    || dirname($a['name']) != dirname($b['name'])
    || $a['range']['min'] == $b['range']['min']) {
        return 0;
    }
    return $a['range']['min'] <=> $b['range']['min'];
});
这很好

问题 现在,我在$files数组中添加以下内容:

array(
    'name' => "resources/js/plugins/module/piece.images.js"
)
将其附加到$files中所需的任何位置,usort将对整个数组重新排序,无逻辑:

Array
(
    [0] => Array
        (
            [name] => DevTools/tools/files/design/js/custom/http_build_query.js
            [range] => Array
                (
                    [min] => 0
                )

        )

    [1] => Array
        (
            [name] => resources/js/plugins/bootstrap-v4/collapse.js
            [range] => Array
                (
                    [min] => 0
                )

        )

    [2] => Array
        (
            [name] => resources/js/plugins/select2.js
        )

    [3] => Array
        (
            [name] => resources/js/plugins/module/piece.image.js
        )

    [4] => Array
        (
            [name] => resources/js/plugins/module/form.submit.js
        )

    [5] => Array
        (
            [name] => resources/js/plugins/module/delete.js
        )

    [6] => Array
        (
            [name] => layouts/cms/.js/+0.js
            [range] => Array
                (
                    [min] => 0
                )

        )

    [7] => Array
        (
            [name] => resources/js/plugins/bootstrap-v4/util.js
            [range] => Array
                (
                    [min] => 0
                )

        )

    [8] => Array
        (
            [name] => resources/js/custom/global.js
        )

    [9] => Array
        (
            [name] => resources/js/plugins/bootstrap-v4/dropdown.js
            [range] => Array
                (
                    [min] => 200
                )

        )

    [10] => Array
        (
            [name] => DevTools/tools/files/design/js/custom/Form.js
            [range] => Array
                (
                    [min] => 0
                )

        )

    [11] => Array
        (
            [name] => resources/js/plugins/bootstrap-v4/index.js
            [range] => Array
                (
                    [min] => 800
                )

        )

    [12] => Array
        (
            [name] => resources/js/plugins/popper.js
        )

    [13] => Array
        (
            [name] => resources/js/plugins/jquery-ui.js
        )

    [14] => Array
        (
            [name] => resources/js/plugins/jquery.js
        )

    [15] => Array
        (
            [name] => DevTools/tools/files/design/js/custom/VanillaJS.js
            [range] => Array
                (
                    [min] => 0
                )

        )

    [16] => Array
        (
            [name] => resources/js/plugins/module/piece.images.js
        )

)
我不知道为什么会这样。如果你能找出原因,你能看看是否有解决办法吗

如果我解释得不好,请在评论中要求澄清


因此,我需要做的是保持它们的顺序,但只对同一文件夹中具有[range][min]的文件进行排序,因此我们按[min]对这些文件进行重新排序。

您能指定预期的输出格式吗?@DamianDziaduch这是我添加的最后一个数组。它们是一个数组。函数usort get的数组,并修改该引用。在那之后,我在标签中打印出了数组,我的意思是你想要从usort得到的数组,而不是usort的实际输出。我不确定您想在这里实现什么。这里与第一个示例相同:“我需要做的是保持它们的顺序,但只对同一文件夹中具有[range][min]的文件进行排序,因此我们按[min]对这些文件进行重新排序。”如果它们具有不同的目录(或其他规则),if()语句(来自closure)返回0(表示“不更改顺序”). 这有意义吗?你能指定预期的输出格式吗?@DamianDziaduch这是我添加的最后一个数组。它们是一个数组。函数usort get的数组,并修改该引用。在那之后,我在标签中打印出了数组,我的意思是你想要从usort得到的数组,而不是usort的实际输出。我不确定您想在这里实现什么。这里与第一个示例相同:“我需要做的是保持它们的顺序,但只对同一文件夹中具有[range][min]的文件进行排序,因此我们按[min]对这些文件进行重新排序。”如果它们具有不同的目录(或其他规则),if()语句(来自closure)返回0(表示“不更改顺序”). 这有意义吗?
Array
(
    [0] => Array
        (
            [name] => DevTools/tools/files/design/js/custom/http_build_query.js
            [range] => Array
                (
                    [min] => 0
                )

        )

    [1] => Array
        (
            [name] => resources/js/plugins/bootstrap-v4/collapse.js
            [range] => Array
                (
                    [min] => 0
                )

        )

    [2] => Array
        (
            [name] => resources/js/plugins/select2.js
        )

    [3] => Array
        (
            [name] => resources/js/plugins/module/piece.image.js
        )

    [4] => Array
        (
            [name] => resources/js/plugins/module/form.submit.js
        )

    [5] => Array
        (
            [name] => resources/js/plugins/module/delete.js
        )

    [6] => Array
        (
            [name] => layouts/cms/.js/+0.js
            [range] => Array
                (
                    [min] => 0
                )

        )

    [7] => Array
        (
            [name] => resources/js/plugins/bootstrap-v4/util.js
            [range] => Array
                (
                    [min] => 0
                )

        )

    [8] => Array
        (
            [name] => resources/js/custom/global.js
        )

    [9] => Array
        (
            [name] => resources/js/plugins/bootstrap-v4/dropdown.js
            [range] => Array
                (
                    [min] => 200
                )

        )

    [10] => Array
        (
            [name] => DevTools/tools/files/design/js/custom/Form.js
            [range] => Array
                (
                    [min] => 0
                )

        )

    [11] => Array
        (
            [name] => resources/js/plugins/bootstrap-v4/index.js
            [range] => Array
                (
                    [min] => 800
                )

        )

    [12] => Array
        (
            [name] => resources/js/plugins/popper.js
        )

    [13] => Array
        (
            [name] => resources/js/plugins/jquery-ui.js
        )

    [14] => Array
        (
            [name] => resources/js/plugins/jquery.js
        )

    [15] => Array
        (
            [name] => DevTools/tools/files/design/js/custom/VanillaJS.js
            [range] => Array
                (
                    [min] => 0
                )

        )

    [16] => Array
        (
            [name] => resources/js/plugins/module/piece.images.js
        )

)