3v4l.org

run code in 300+ PHP versions simultaneously
<?php $values=[ ["id"=> 0,"dn"=> "OU=Microsoft Exchange Security Groups,DC=local,DC=com"], ["id"=> 1,"dn"=> "OU=Domain Controllers,DC=local,DC=com"], ["id"=> 2,"dn"=> "OU=DIT,OU=DVIOU,DC=local,DC=com"], ["id"=> 3,"dn"=> "OU=Service Accounts,DC=local,DC=com"], ["id"=> 4,"dn"=> "OU=STT,OU=DIT,OU=DVIOU,DC=local,DC=com"], ["id"=> 5,"dn"=> "OU=STX,OU=DIT,OU=DVIOU,DC=local,DC=com"], ["id"=> 6,"dn"=> "OU=DVIOU,DC=local,DC=com"], ["id"=> 7,"dn"=> "OU=DPW,OU=DVIOU,DC=local,DC=com"], ["id"=> 8,"dn"=> "OU=STT,OU=DPW,OU=DVIOU,DC=local,DC=com"], ["id"=> 9,"dn"=> "OU=OLG,OU=DVIOU,DC=local,DC=com"], ["id"=> 10,"dn"=> "OU=DIT_Consultants,OU=DIT,OU=DVIOU,DC=local,DC=com"], ["id"=> 11,"dn"=> "OU=911,OU=DVIOU,DC=local,DC=com"], ["id"=> 12,"dn"=> "OU=Users,OU=911,OU=DVIOU,DC=local,DC=com"], ["id"=> 13,"dn"=> "OU=PERB,OU=DVIOU,DC=local,DC=com"], ["id"=> 14,"dn"=> "OU=STX,OU=PERB,OU=DVIOU,DC=local,DC=com"] ]; //Let's make dictionary foreach($values as $val){ //Find all OU preg_match_all('/OU=([^,]+)/',$val['dn'],$m); //print_r($m); $name=$m[1][0]; //Add elements to array $val=array_merge($val,[ 'name'=>$name, 'parent'=>0, //This will be done later 'level'=>count($m[1]), 'parent_name'=>$m[1][1] ?? '', ]); $dict[$name]=$val; } print_r($dict); //Let's get parent IDs from dictionary by name foreach($dict as &$val) $val['parent']=$dict[$val['parent_name']]['id'] ?? 0; print_r($dict); //Remove keys $result=array_values($dict); //Sort by IDs sort($result); print_r($result);
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 77) Position 1 = 2, Position 2 = 30
Branch analysis from position: 2
2 jumps found. (Code = 78) Position 1 = 3, Position 2 = 30
Branch analysis from position: 3
1 jumps found. (Code = 42) Position 1 = 2
Branch analysis from position: 2
Branch analysis from position: 30
2 jumps found. (Code = 125) Position 1 = 35, Position 2 = 44
Branch analysis from position: 35
2 jumps found. (Code = 126) Position 1 = 36, Position 2 = 44
Branch analysis from position: 36
1 jumps found. (Code = 42) Position 1 = 35
Branch analysis from position: 35
Branch analysis from position: 44
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 44
Branch analysis from position: 30
filename:       /in/5dSC1
function name:  (null)
number of ops:  59
compiled vars:  !0 = $values, !1 = $val, !2 = $m, !3 = $name, !4 = $dict, !5 = $result
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
    2     0  E >   ASSIGN                                                   !0, <array>
   21     1      > FE_RESET_R                                       $7      !0, ->30
          2    > > FE_FETCH_R                                               $7, !1, ->30
   23     3    >   INIT_FCALL                                               'preg_match_all'
          4        SEND_VAL                                                 '%2FOU%3D%28%5B%5E%2C%5D%2B%29%2F'
          5        FETCH_DIM_R                                      ~8      !1, 'dn'
          6        SEND_VAL                                                 ~8
          7        SEND_REF                                                 !2
          8        DO_ICALL                                                 
   25     9        FETCH_DIM_R                                      ~10     !2, 1
         10        FETCH_DIM_R                                      ~11     ~10, 0
         11        ASSIGN                                                   !3, ~11
   27    12        INIT_FCALL                                               'array_merge'
         13        SEND_VAR                                                 !1
   28    14        INIT_ARRAY                                       ~13     !3, 'name'
   29    15        ADD_ARRAY_ELEMENT                                ~13     0, 'parent'
   30    16        FETCH_DIM_R                                      ~14     !2, 1
         17        COUNT                                            ~15     ~14
         18        ADD_ARRAY_ELEMENT                                ~13     ~15, 'level'
   31    19        FETCH_DIM_IS                                     ~16     !2, 1
         20        FETCH_DIM_IS                                     ~17     ~16, 1
         21        COALESCE                                         ~18     ~17
         22        QM_ASSIGN                                        ~18     ''
         23        ADD_ARRAY_ELEMENT                                ~13     ~18, 'parent_name'
         24        SEND_VAL                                                 ~13
   27    25        DO_ICALL                                         $19     
         26        ASSIGN                                                   !1, $19
   34    27        ASSIGN_DIM                                               !4, !3
         28        OP_DATA                                                  !1
   21    29      > JMP                                                      ->2
         30    >   FE_FREE                                                  $7
   36    31        INIT_FCALL                                               'print_r'
         32        SEND_VAR                                                 !4
         33        DO_ICALL                                                 
   39    34      > FE_RESET_RW                                      $23     !4, ->44
         35    > > FE_FETCH_RW                                              $23, !1, ->44
   40    36    >   FETCH_DIM_R                                      ~25     !1, 'parent_name'
         37        FETCH_DIM_IS                                     ~26     !4, ~25
         38        FETCH_DIM_IS                                     ~27     ~26, 'id'
         39        COALESCE                                         ~28     ~27
         40        QM_ASSIGN                                        ~28     0
         41        ASSIGN_DIM                                               !1, 'parent'
         42        OP_DATA                                                  ~28
   39    43      > JMP                                                      ->35
         44    >   FE_FREE                                                  $23
   42    45        INIT_FCALL                                               'print_r'
         46        SEND_VAR                                                 !4
         47        DO_ICALL                                                 
   45    48        INIT_FCALL                                               'array_values'
         49        SEND_VAR                                                 !4
         50        DO_ICALL                                         $30     
         51        ASSIGN                                                   !5, $30
   47    52        INIT_FCALL                                               'sort'
         53        SEND_REF                                                 !5
         54        DO_ICALL                                                 
   48    55        INIT_FCALL                                               'print_r'
         56        SEND_VAR                                                 !5
         57        DO_ICALL                                                 
         58      > RETURN                                                   1

Generated using Vulcan Logic Dumper, using php 8.0.0


preferences:
144.86 ms | 1014 KiB | 18 Q