3

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
                            )

                    )

            )

thank you

  • this needs more context. A sample array to filter perhaps. Also there are more efficient ways to handle JS arrays. [js arrays](https://www.youtube.com/watch?v=Rx_JFOSxgpY) – andre mcgruder Jun 20 '16 at 17:01
  • I am using php. the end result will be html –  Jun 20 '16 at 17:11

1 Answers1

0

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)
 */
Matt Raines
  • 4,149
  • 8
  • 31
  • 34
  • Thank you for your time, but I could not get it to work with my array, and as the array will always change, I cant use it. Thanks again. –  Jun 21 '16 at 09:35
  • I don't follow what you mean about the array changing. If you post some sample data it doesn't work for, I'll do my best to fix it. – Matt Raines Jun 21 '16 at 09:50
  • Ok Thank you above is some the full sample data, but this data will change. –  Jun 21 '16 at 09:57
  • When I run it, it says Unresolvable dependency? Also some arrays are missing like the administration –  Jun 21 '16 at 10:04
  • That's because you have an unresolvable dependency (an infinite loop) :) "cookie" depends on "administration", "administration" depends on "checkbox", "checkbox" depends on "sticky", "sticky" depends on "cookie". – Matt Raines Jun 21 '16 at 10:08
  • It's nice to hear I could help with your problem. The established way to say "thanks" at Stack Overflow is to upvote or accept the answer. You can only accept one answer to each of your questions, which rewards the poster who solved your problem and informs others that your issue is resolved. Have a read of [What should I do when someone answers my question?](//stackoverflow.com/help/someone-answers) before deciding whether to upvote or accept an answer. – Matt Raines Jun 21 '16 at 10:35
  • OK done that, but this message sprung up : Thanks for the feedback! Once you earn a total of 15 reputation, your votes will change the publicly displayed post score. So I guess I have to earn those reputations ;-) Thanks again –  Jun 21 '16 at 10:41
  • Instead of using die is there a way to remove the offending part of the array and continuing to the end of the array. –  Jun 21 '16 at 12:38
  • You could replace `die("Unresolvable dependency");` with `break;` to exit the `while` loop if you get in an infinite loop. – Matt Raines Jun 21 '16 at 12:40