【问题标题】:Sort array dependent of another array keys values排序依赖于另一个数组键值的数组
【发布时间】:2016-10-22 00:35:09
【问题描述】:

谁能告诉我如何根据每个数组的依赖键对该数组进行排序的示例。我希望数组按依赖顺序排列,所以首先是 jquery,然后是 cookie、bootstrap、checkbox、admin。我看过其他帖子,但它们对我来说没有意义。这是整个数组的一小部分,数组可以是任意顺序和长度。

谁能给我看一个可以做到这一点的sn-p代码。

         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 arrays
  • 我正在使用 php。最终结果将是 html

标签: php arrays sorting dependencies


【解决方案1】:

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

我没有对它进行破坏测试,但它适用于您的示例。

$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)
 */

【讨论】:

  • 感谢您抽出宝贵时间,但我无法让它与我的阵列一起使用,并且由于阵列总是会改变,我无法使用它。再次感谢。
  • 我不理解你所说的数组改变的意思。如果您发布一些它不起作用的示例数据,我会尽力修复它。
  • 好的谢谢上面是一些完整的样本数据,但是这个数据会改变。
  • 当我运行它时,它说 Unresolvable dependency?还缺少一些数组,例如管理
  • 那是因为你有一个无法解决的依赖(一个无限循环) :) “cookie”依赖于“administration”,“administration”依赖于“checkbox”,“checkbox”依赖于“sticky”,“粘性”取决于“cookie”。
猜你喜欢
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
  • 2020-01-28
  • 2021-07-17
相关资源
最近更新 更多