Как вывести уровень вложенности в массиве?

#1 10 декабря 2013 в 21:53
Уважаемые кодеры, прошу помощи. Я видимо уже совсем отупел за последние дни))

Есть функция
  1.  
  2. //$arr - массив
  3. //$id - ключ(идентификатор) нужного элемента массива
  4. public function newTree($arr, $id){
  5. foreach ($arr as $key => $item) {
  6. if ($id == $key) {
  7. return $item;
  8. } elseif (!empty($item['children']) && is_array($item['children'])) {
  9. $result = $this->newTree($item['children'], $id);
  10. if ($result !== false) {
  11. return $result;
  12. }
  13. }
  14. }
  15. return false;
  16. }
  17.  
  18.  
Функция ищет в многомерном массиве нужный элемент.

Как мне вывести уровень вложенности этого элемента?

Пробовал делать так, не получается

  1.  
  2. public function newTree($arr, $id, $level=0){
  3. foreach ($arr as $key => $item) {
  4. if ($id == $key) {
  5. return array($item, $level);
  6. } elseif (!empty($item['children']) && is_array($item['children'])) {
  7. $level++;
  8. $result = $this->newTree($item['children'], $id, $level);
  9. if ($result !== false) {
  10. return array($result, $level);
  11. }
  12. }
  13. }
  14. return false;
  15. }
  16.  
#2 11 декабря 2013 в 00:52
kir, ты не понял, или я хреново объяснил), сам нужный элемент по ключу я нахожу, я не могу вывести его уровень вложенности. Т.е цифру, которая соответствует уровню вложенности
#3 11 декабря 2013 в 01:28


kir, ты не понял, или я хреново объяснил), сам нужный элемент по ключу я нахожу, я не могу вывести его уровень вложенности. Т.е цифру, которая соответствует уровню вложенности

Rossoman

  1.  
  2. function findDeepInArray($array, $key, $level = -1, $deep = array('find' => false, 'level' => 0))
  3. {
  4. $level++;
  5. if(!is_array($array)){
  6. return $deep;
  7. }
  8.  
  9. if(isset($array[$key])) {
  10. $deep = array(
  11. 'find' => true,
  12. 'level' => $level
  13. );
  14. } else {
  15. foreach($array as $value){
  16. $deep = findDeepInArray($value, $key, $level, $deep);
  17. }
  18. }
  19.  
  20. return ($level) ? (($deep['find'] == true) ? $deep : $deep) : (($deep['find'] == true) ? $deep['level'] : false);
  21.  
  22. }
  23.  
сорри не заметил, код не оч. нравится, но в 6 утра хочется спать, а не кодить crazy

0 уровень — начальный, итп
#4 11 декабря 2013 в 01:33
kir, я и забыл сколько времени у тебя)) спс, попробую, завтра теперь отпишусь
#5 11 декабря 2013 в 01:47
kir, работает вроде, только уровень выводит не как 1,2,3 — а 2,4,6 ))
#6 11 декабря 2013 в 12:42
kir, за наводку спасибо) Посмотрел на свежую голову и поправил свою функцию, плюсодинил не в том месте. Надо было просто плюсодин вынести из цикла.
#7 11 декабря 2013 в 19:41

kir, работает вроде, только уровень выводит не как 1,2,3 — а 2,4,6 ))

Rossoman

тестировал на произвольном многомерном массиве со строковыми ключами, выводило всё нормально по уровням, значит входной массив не совсем обычный у тебя.;)

да не за что собственно говоря. ;)
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.