fork download
  1. <?php
  2.  
  3. $arr = [
  4. 0 => [
  5. 'id' => 0,
  6. 'dir_name' => '',
  7. 'children' => [
  8. 36 => [
  9. 'id' => 36,
  10. 'dir_name' => 'dir 36',
  11. 'children' => [
  12. 92 => [
  13. 'id' => 92,
  14. 'dir_name' => 'dir 92',
  15. 'children' => [
  16. 93 => [
  17. 'id' => 93,
  18. 'dir_name' => 'dir 93'
  19. ]
  20. ]
  21. ],
  22. 94 => [
  23. 'id' => 94,
  24. 'dir_name' => 'dir 94',
  25. 'children' => [
  26. 95 => [
  27. 'id' => 95,
  28. 'dir_name' => 'dir 95'
  29. ]
  30. ]
  31. ]
  32. ]
  33. ]
  34. ]
  35. ]
  36. ];
  37.  
  38. function all_dir($array, $id_selected = 0, $pos = 0, $tab_pos = [])
  39. {
  40. $flat = [];
  41.  
  42. foreach ($array as $k => $value)
  43. {
  44.  
  45. if (is_array($value))
  46. $flat = array_merge($flat, all_dir($value, $id_selected, $pos, $tab_pos));
  47. else
  48. {
  49. if ($k == "id")
  50. {
  51. $option = '<option value="' . $value . '"';
  52. if ($value == $id_selected)
  53. $option .=" selected ";
  54. }
  55.  
  56. if ($k == "dir_name")
  57. {
  58. $flat[] = $value;
  59. $tab_pos[$pos] = $value;
  60.  
  61. $val = '';
  62. for ($i = 0; $i <= $pos; $i++)
  63. {
  64. $val .= $tab_pos[$i] . '/';
  65. }
  66.  
  67. $option .='>' . $val . '</option>'.PHP_EOL;
  68.  
  69. echo $option;
  70.  
  71. $pos++;
  72. }
  73. }
  74. }
  75. return $flat;
  76. }
  77.  
  78. function get_dir($array, $names = [])
  79. {
  80. $ret = [];
  81.  
  82. foreach ($array as $k => $v)
  83. {
  84. $id = $v['id'];
  85. $name = $v['dir_name'];
  86.  
  87. $ret[$id] = $names;
  88. $ret[$id][] = $name;
  89.  
  90. if (!empty($v['children']))
  91. {
  92. $xret = get_dir($v['children'], $ret[$id]);
  93.  
  94. foreach ($xret as $kk => $vv)
  95. {
  96. $ret[$kk] = $vv;
  97. }
  98. }
  99. }
  100.  
  101. return $ret;
  102. }
  103.  
  104. function get_dir_root($array)
  105. {
  106. $ret = [];
  107.  
  108. foreach (get_dir($array) as $k => $v)
  109. {
  110. $ret[$k] = implode ('/', $v);
  111.  
  112. if ($ret[$k] == '')
  113. $ret[$k] = '/';
  114. else
  115. $ret[$k] .= '/';
  116. }
  117.  
  118. return $ret;
  119. }
  120.  
  121. var_export(all_dir($arr, 93));
  122. var_export(get_dir_root($arr));
  123.  
Success #stdin #stdout 0s 52488KB
stdin
Standard input is empty
stdout
<option value="0">/</option>
<option value="36">/dir 36/</option>
<option value="92">/dir 36/dir 92/</option>
<option value="93" selected >/dir 36/dir 92/dir 93/</option>
<option value="94">/dir 36/dir 94/</option>
<option value="95">/dir 36/dir 94/dir 95/</option>
array (
  0 => '',
  1 => 'dir 36',
  2 => 'dir 92',
  3 => 'dir 93',
  4 => 'dir 94',
  5 => 'dir 95',
)array (
  0 => '/',
  36 => '/dir 36/',
  92 => '/dir 36/dir 92/',
  93 => '/dir 36/dir 92/dir 93/',
  94 => '/dir 36/dir 94/',
  95 => '/dir 36/dir 94/dir 95/',
)