排序依赖于另一个数组键值的数组
谁能告诉我如何根据每个数组的依赖键对该数组进行排序的示例.我希望数组按依赖顺序排列,所以首先是 jquery,然后是 cookie、bootstrap、checkbox、admin.我看过其他帖子,但它们对我来说没有意义.这是整个数组的一小部分,数组可以是任意顺序和长度.
Can anyone show me an example of how to sort this array dependent on the dependency key of each array. I would like the array to be in order of the dependency so jquery first then cookie,bootstrap,checkbox,admin. I have looked at other posts but they did not make sense to me. This is a small piece of the full array, the array might be in any order and length.
谁能给我看一段代码可以做到这一点.
Can anyone show me a snippet of code that would do this.
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
)
)
)
谢谢
推荐答案
可能有许多不同的方法来解决这个问题.在这里,我循环遍历脚本数组,在添加任何没有进一步依赖关系的脚本之前删除输出数组中已经存在的所有依赖项.
There are probably a number of different approaches to solving this. Here I loop over the array of scripts, removing any dependencies that are already in the output array before adding any scripts with no further dependencies.
我没有对它进行破坏测试,但它适用于您的示例.
I didn't test it to destruction but it works with your example.
$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)
*/
相关文章