根据另一个数组键值对的值,对数组进行排序

3

有没有人能给我展示一个根据每个数组的依赖键来排序这个数组的例子。我希望这个数组按照依赖关系的顺序排列,所以首先是jquery,然后是cookie、bootstrap、checkbox和admin。我查看了其他帖子,但它们对我来说都没有意义。这是完整数组的一小部分,数组可能是任何顺序和长度。

有没有人能给我展示一段代码片段来实现这个目标。

         Array
            (
                [0] => Array
                    (
                        [name] => jquery
                        [version] => 1.1
                        [file] => vendor/jquery/jquery.js
                    )

                [1] => Array
                    (
                        [name] => cookie
                        [version] => 1.0
                        [file] => vendor/cookie/cookie.js
                        [dependency] => Array
                            (
                                [0] => administration
                                [1] => jquery
                            )

                    )

                [2] => Array
                    (
                        [name] => bootstrap
                        [version] => 1.0
                        [file] => vendor/bootstrap/js/bootstrap.js
                        [dependency] => Array
                            (
                                [0] => jquery
                            )

                    )

                [3] => Array
                    (
                        [name] => checkbox
                        [version] => 1.0
                        [file] => vendor/checkbox/checkbox.js
                        [dependency] => Array
                            (
                                [0] => jquery
                                [1] => sticky
                            )

                    )

                [4] => Array
                    (
                        [name] => datepicker
                        [version] => 1.0
                        [file] => vendor/datepicker/datepicker.js
                        [dependency] => Array
                            (
                                [0] => jquery
                            )

                    )

                [5] => Array
                    (
                        [name] => nanobar
                        [version] => 1.0
                        [file] => vendor/nanobar/nanobar.js
                        [dependency] => Array
                            (
                                [0] => jquery
                            )

                    )

                [6] => Array
                    (
                        [name] => owlcarousel
                        [version] => 1.0
                        [file] => vendor/owlcarousel/owlcarousel.js
                        [dependency] => Array
                            (
                                [0] => jquery
                            )

                    )

                [7] => Array
                    (
                        [name] => selectmultiple
                        [version] => 1.0
                        [file] => vendor/selectmultiple/selectmultiple.js
                        [dependency] => Array
                            (
                                [0] => jquery
                            )

                    )

                [8] => Array
                    (
                        [name] => selectric
                        [version] => 1.0
                        [file] => vendor/selectric/selectric.js
                        [dependency] => Array
                            (
                                [0] => jquery
                            )

                    )

                [9] => Array
                    (
                        [name] => sortable
                        [version] => 1.0
                        [file] => vendor/sortable/sortable.js
                        [dependency] => Array
                            (
                                [0] => jquery
                            )

                    )

                [10] => Array
                    (
                        [name] => uisortableanimation
                        [version] => 1.0
                        [file] => vendor/uisortableanimation/uisortableanimation.js
                        [dependency] => Array
                            (
                                [0] => jquery
                            )

                    )

                [11] => Array
                    (
                        [name] => summernote
                        [version] => 1.0
                        [file] => vendor/summernote/summernote.js
                        [dependency] => Array
                            (
                                [0] => jquery
                            )

                    )

                [12] => Array
                    (
                        [name] => validation
                        [version] => 1.0
                        [file] => vendor/validation/validation.js
                        [dependency] => Array
                            (
                                [0] => jquery
                            )

                    )

                [13] => Array
                    (
                        [name] => sticky
                        [version] => 1.0
                        [file] => vendor/sticky/sticky.js
                        [dependency] => Array
                            (
                                [0] => cookie
                                [1] => jquery
                            )

                    )

                [14] => Array
                    (
                        [name] => jrate
                        [version] => 1.0
                        [file] => vendor/jrate/jrate.js
                        [dependency] => Array
                            (
                                [0] => jquery
                            )

                    )

                [15] => Array
                    (
                        [name] => retina
                        [version] => 1.1
                        [file] => vendor/retina/retina1.js
                        [dependency] => Array
                            (
                                [0] => jquery
                            )

                    )

                [16] => Array
                    (
                        [name] => confirmation
                        [version] => 1.0
                        [file] => vendor/confirmation/confirmation.js
                        [dependency] => Array
                            (
                                [0] => jquery
                            )

                    )

                [17] => Array
                    (
                        [name] => bootstrapfilestyle
                        [version] => 1.0
                        [file] => vendor/bootstrapfilestyle/bootstrap-filestyle.js
                        [dependency] => Array
                            (
                                [0] => jquery
                            )

                    )

                [18] => Array
                    (
                        [name] => minicolors
                        [version] => 1.0
                        [file] => vendor/minicolors/minicolors.js
                        [dependency] => Array
                            (
                                [0] => jquery
                            )

                    )

                [19] => Array
                    (
                        [name] => administration
                        [version] => 1.0
                        [file] => javascript/index.js
                        [dependency] => Array
                            (
                                [0] => jquery
                                [1] => bootstrap
                                [2] => checkbox
                                [3] => datepicker
                                [4] => nanobar
                                [5] => owlcarousel
                                [6] => selectmultiple
                                [7] => selectric
                                [8] => sortable
                                [9] => uisortableanimation
                                [10] => summernote
                                [11] => validation
                                [12] => jrate
                                [13] => retina
                                [14] => confirmation
                                [15] => bootstrapfilestyle
                                [16] => minicolors
                            )

                    )

            )

谢谢你


这需要更多的上下文。也许需要一个示例数组来过滤。此外,处理JS数组有更高效的方法。JS数组 - andre mcgruder
我正在使用 PHP。最终结果将是 HTML <script>,以正确的顺序请求 JS 文件。 - user3188033
1个回答

0

解决这个问题可能有许多不同的方法。在这里,我循环遍历脚本数组,在添加没有进一步依赖关系的任何脚本之前,先从输出数组中删除已经存在的依赖项。

我没有进行彻底测试,但它可以使用您的示例。

$sorted = [];
while ($count = count($scripts)) {
    // Remove any met dependencies.
    foreach ($scripts as $script_id => $script) {
        if (isset($script["dependency"])) {
            foreach ($script["dependency"] as $dep_id => $dep) {
                if (isset($sorted[$dep])) {
                    unset($scripts[$script_id]["dependency"][$dep_id]);
                }
            }
            if (!count($scripts[$script_id]["dependency"])) {
                unset($scripts[$script_id]["dependency"]);
            }
        }
    }
    // Add scripts with no more dependencies to the output array.
    foreach ($scripts as $script_id => $script) {
        if (!isset($script["dependency"])) {
            $sorted[$script["name"]] = $script;
            unset($scripts[$script_id]);
        }
    }
    if (count($scripts) == $count) {
        die("Unresolvable dependency");
    }
}
var_dump(array_values($sorted));

/*
array (size=5)
  0 => 
    array (size=3)
      'name' => string 'jquery' (length=6)
      'version' => string '1.1' (length=3)
      'file' => string 'vendor/jquery/jquery.js' (length=23)
  1 => 
    array (size=3)
      'name' => string 'cookie' (length=6)
      'version' => string '1.0' (length=3)
      'file' => string 'vendor/cookie/cookie.js' (length=23)
  2 => 
    array (size=3)
      'name' => string 'bootstrap' (length=9)
      'version' => string '1.0' (length=3)
      'file' => string 'vendor/bootstrap/js/bootstrap.js' (length=32)
  3 => 
    array (size=3)
      'name' => string 'checkbox' (length=8)
      'version' => string '1.0' (length=3)
      'file' => string 'vendor/checkbox/checkbox.js' (length=27)
  4 => 
    array (size=3)
      'name' => string 'admin' (length=5)
      'version' => string '1.0' (length=3)
      'file' => string 'vendor/admin/code.js' (length=20)
 */

谢谢您的时间,但是我无法让它与我的数组一起工作,而且由于数组将始终更改,我无法使用它。再次感谢。 - user3188033
我不明白你所说的数组变化是什么意思。如果你发布一些它无法工作的样本数据,我会尽力修复它。 - Matt Raines
好的,谢谢。以上是一些完整的样本数据,但这些数据会发生变化。 - user3188033
当我运行它时,它显示无法解决的依赖项?还有一些数组丢失,比如管理。 - user3188033
这是因为您有一个无法解决的依赖关系(无限循环):) “cookie” 依赖于 “administration”,“administration” 依赖于 “checkbox”,“checkbox” 依赖于 “sticky”,“sticky” 依赖于 “cookie”。 - Matt Raines
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接