За последние 24 часа нас посетили 53387 программистов и 1717 роботов. Сейчас ищут 862 программиста ...

Получить имя многомерного массива

Тема в разделе "Прочие вопросы по PHP", создана пользователем Shin0by, 22 авг 2015.

  1. Shin0by

    Shin0by Новичок

    С нами с:
    22 авг 2015
    Сообщения:
    5
    Симпатии:
    0
    Приветствую. Много тем существует по получению имени элемента многомерных массивов с использованием key(), но это не тот случай. В моем случае я использую многомерный массив сформированный из JSON данных типа:
    Код (Text):
    1. main: [{
    2.         "content1": "...",
    3.         "content2": "...",
    4.         "sub": {
    5.             "content10": "...",
    6.             "content20": "...",
    7.             "demosub": [{
    8.                 "content100": "...",
    9.                 "content200": "...",
    Тэги в примере выше не закрываю, структура думаю и так ясна и она в рабочей версии верная. Так вот, у меня нет проблемы обратиться к элементу массива после обработки JSON путем: $arr[main][0]['sub'][content10'], а есть задача получить все элементы массива "sub" тобиш сделать это нужно по его имени. Я использую функцию рекурсии для перебора всех элементов массива:
    Код (Text):
    1. function ArrRunner($arr,$tagFilter){
    2.     foreach($arr as $a){
    3.         if (is_array($a)){
    4.             ArrRunner($a,$tagFilter);
    5.         }else{}
    6.     }
    7. }
    И куда и как я не втыкал "echo key();" пытаясь получить или key от $a или key от $arr, мне никак не возвращается имя вложенного массива. Там где оно вроде должно быть возвращается "0", но у меня дофига разных субмассивов и мне нужны конкретные по конкретным именам, так что проверка по 0 не прокатит. Как быть? Нужно узнать имя суб массива, или его элементов (на примере они "content10" и ""content20", но их key (элементов массива sub) различны, тобиш мне надо получить в итоге из массива(массивов) с именем "sub" все его элементы и их ключи без получения значений и ключей их суб элементов и суб массивов (в примере это demosub, content100, content200)). Дополню, что суб массивы с именем sub могут встречаться много раз и на разных уровнях вложенности главного массива - потому я использую рекурсию.
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    foreach ($arr[main][0]['sub'] as $key => $val)
    var_dump($key, $val);
     
  4. Shin0by

    Shin0by Новичок

    С нами с:
    22 авг 2015
    Сообщения:
    5
    Симпатии:
    0
    По описанию похоже, чуть позже проверю.

    Проблема в том, что у меня может быть $arr[main][0].......сколько угодно и чего угодно.........['sub']....много всего....[sub]..дофига..[sub]....

    тобиш у меня нет чёткой структуры - она может меняться, но там почти всегда будет некий суб массив с определенным именем и мне нужно из него или из их (их может быть много и они могут быть вложены даже друг в друга), получить их элементы 1го уровня вложенности.
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Запускай рекурсивно, да.
     
  6. Shin0by

    Shin0by Новичок

    С нами с:
    22 авг 2015
    Сообщения:
    5
    Симпатии:
    0
    Всё получилось, спасибо.
    На всякий случай моя функция, перебирает все элементы многомерного массива и выводит значения содержащиеся в именованном саб массиве (имя которого указывается в параметре) не выводя при этом значения и массивы находящиеся глубже 1 уровня. Может ее как то оптимизировать можно еще (я о логике,а не о сокращениях в самом написании)

    Код (PHP):
    1. function ArrRunner($arr,$tagFilter){
    2.     foreach ($arr as $key => $val){
    3.         if (is_array($val)){
    4.             if($key==$tagFilter){
    5.                 if (isset($val['images'])) {
    6.                     foreach ($val['images'] as $key2 => $val2){
    7.                         echo $key2."<br>";
    8.                     }
    9.                 }
    10.                 ArrRunner($val,$tagFilter); 
    11.             }else{
    12.                 ArrRunner($val,$tagFilter); 
    13.             }
    14.         }
    15.     }
    16. }  
    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  7. Shin0by

    Shin0by Новичок

    С нами с:
    22 авг 2015
    Сообщения:
    5
    Симпатии:
    0
    Вот замануха... А как мне теперь сделать так, что бы вместо echo, функция в итоге вернула массив двухмерный с результатом отработки? Что то я уже и передвать параметром пытался, и в конце вывести результат пробовал.
     
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Третий аргумент рекурсивной функции используй, там накапливай данные и потом возвращай
     
  9. Shin0by

    Shin0by Новичок

    С нами с:
    22 авг 2015
    Сообщения:
    5
    Симпатии:
    0
    ок. сейчас еще раз попробую, уже просто пробовал но как то не особо вышло. пока возвращаю функцией в себя примерно вот так
    Код (Text):
    1. $aaa[] = ArrRunner($val,$tagFilter);
    и потом уже в конце ретурню этот же массив. Но там стока вложенных массивов выходит что пипец.
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Поздравляю с успехом!

    array_merge как раз тут пригодится