За последние 24 часа нас посетили 62018 программистов и 1677 роботов. Сейчас ищут 954 программиста ...

Как вытащить данные из многомерного массива

Тема в разделе "PHP для новичков", создана пользователем desertFox, 20 авг 2014.

  1. desertFox

    desertFox Активный пользователь

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    Здравствуйте,

    Не знаю как правильно вытащить данные из многомерного массива, пока пришёл к такому решению:

    Код (Text):
    1.  
    2.  foreach($faq as $key => $vol) {
    3.   foreach($faq[$key] as $answers) {
    4.     printf('<li id="answer%s"><span class="spanh3">%s</span>%s</li>'."\n",$answers['id_question'],$answers['question'],$answers['answer']);
    5.   }
    6. }
    Я использую первый цикл для того, чтобы всего лишь получить ключи вложенных массивов, хоть и работает, но чую это какая ерунда) Есть ли ещё способы получить ключи? Ключи у меня числа, но они не по порядку, т.е. 1, 3, 4, 8
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Почти правильно. $vol - это массив, если $faq многомерен. так что во втором foreach можно использовать его вместо $faq[$key]. Ответ на второй вопрос - array_keys()
     
  3. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    array_keys()
    но в приведённом коде никак не получится изменить тот факт, что нужен будет цикл по ключам + цикл по каждому ответу.
     
  4. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Массив в студию.
     
  5. desertFox

    desertFox Активный пользователь

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    вот массив:

    Код (Text):
    1.  
    2. Array
    3. (
    4.     [1] => Array
    5.         (
    6.             [1] => Array
    7.                 (
    8.                     [id_question] => 1
    9.                     [hide] => show
    10.                     [n_group] => 1
    11.                     [question] => Как установить плагин?
    12.                     [answer] =>
    13.  
    14. The main aim of this site is to help people follow their heart.
    15.  
    16.                     [position] => 1
    17.                 )
    18.  
    19.             [2] => Array
    20.                 (
    21.                     [id_question] => 2
    22.                     [hide] => show
    23.                     [n_group] => 1
    24.                     [question] => Какие права доступа бывают?
    25.                     [answer] =>
    26.  
    27. Morbi imperdiet aliquam condimentum. Ut a sem nisl, nec mollis tellus.
    28.  
    29.                     [position] => 2
    30.                 )
    31.  
    32.         )
    33.  
    34.     [2] => Array
    35.         (
    36.             [3] => Array
    37.                 (
    38.                     [id_question] => 3
    39.                     [hide] => show
    40.                     [n_group] => 2
    41.                     [question] => Зачем нужно регистрироваться?
    42.                     [answer] =>
    43.  
    44. The main aim of this site is to help people follow their heart.
    45.  
    46.                     [position] => 5
    47.                 )
    48.  
    49.             [4] => Array
    50.                 (
    51.                     [id_question] => 4
    52.                     [hide] => show
    53.                     [n_group] => 2
    54.                     [question] => Что делать, если забыли пароль
    55.                     [answer] =>
    56.  
    57. The main aim of this site is to help people follow their heart.
    58.  
    59.                     [position] => 6
    60.                 )
    61.  
    62.         )
    63.  
    64. )
     
  6. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Блин, треш какой-то, а не массив
    Я бы сделал так:
    Код (Text):
    1. foreach ($arr as $key=>$item) $out[]=array_values($item);
    Получите нормальный массив с нормальной нумерацией, а не со сквозной, начинающейся с 1.
     
  7. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    лишний массив, поэтому лишний цикл. может разделы какие-то. в принципе всё верно, только не стоит называть перменную "ответы", когда в ней живёт и вопрос, а ответ всего один.
     
  8. desertFox

    desertFox Активный пользователь

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    так я список вопросов уже вывел в одном блоке, а список ответов нужно вывести в другом, ответы и вопросы должны быть связаны по общему id, ну чтобы якоря сделать.. ещё у меня вопросы разделены по группам, вот поэтому на выходе и получился такой массив -

    Группа вопросов 1
    - Вопрос 1
    - Вопрос 2
    - Вопрос 3
    Группа вопросов 2
    - Вопрос 1
    - Вопрос 2
    - Вопрос 3
    ... и т.д.
    ---------------------
    а ниже список ответов---
    ..........

    может я не верно изначально всё спланировал, вот и получается лишний цикл, да тут ещё выбор - либо лишний запрос делать либо лишний цикл)
     
  9. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    что значит "ниже"? Отдельно от вопросов будут ответы? =) зачем?
     
  10. desertFox

    desertFox Активный пользователь

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
  11. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    что ты имеешь в виду, друг?
     
  12. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Одно другому не мешает, если циклы построены корректно и не зацикливаются. Хотя зациклить foreach - это надо очень постараться...
     
  13. desertFox

    desertFox Активный пользователь

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    вот это я имею ввиду, не верен что я правильно сделал цикл который в самом начале показал, хотел узнать есть ли ещё способы решить туже самую задачу без запросов к бд, а также в процессе обсуждения появился новый вопрос - а что менее ресурсопотребляемое - использовать больше запросов к БД но меньше циклов, или наоборот - пусть будет больше циклов но за зато меньше запросов?

    я то всё думаю что любыми путями нужно сделать меньше запросов к бд, только откуда это взял не помню

    Добавлено спустя 29 минут 3 секунды:
    немножко изменил код на такой вариант
    не слишком страшный?
    Код (Text):
    1.  
    2. foreach($faq as $vol) {
    3.   foreach($vol as $answers) {
    4.     printf('<li id="answer%s"><span class="span-h3">%s</span>%s</li>'."\n",$answers['id_question'],$answers['question'],$answers['answer']);
    5.   }
    6. }
     
  14. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты показал структуру, в которой так переменную назвать глупо. объясни пожалуйста, что у тебя в $answers.
     
  15. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    По моему опыту один запрос к БД вместо двух - это обычно незаметно, даже один вместо 10. Вот когда я на реальном проекте уменьшил количество запросов с 1000 (не ожидал, что клиент задаст такое кол-во данных) до 1, это конечно дало эффект.
     
  16. desertFox

    desertFox Активный пользователь

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    спасибо, понял

    Добавлено спустя 13 минут 47 секунд:
    массив который показал выше уже второй раз использую), первый раз с помощью его вывел список вопросов по группам, каждый вопрос как ссылка на ответ, там переменная называется $questions

    а второй раз, который сейчас тут, вывожу список ответов, в заголовке ответов также вопрос присутствует но уже никак ссылка а как заголовок, поэтому в этом цикле назвал её $answers

    [1] => Array - $answers['id_question']
    [question] => Как установить плагин? - $answers['question']
    [answer] => The main aim of this site is to help people follow their heart. - $answers['answer']
     
  17. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    именование переменных - это очень важный вопрос. =)
     
  18. desertFox

    desertFox Активный пользователь

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    не спорю, поэтому назвал так, чтобы самому не запутаться)
     
  19. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    т.е. ты назвал переменную "ответы", хотя в ней только один ответ, и между прочим даже вопрос? =) ты уверен, что ты поступил верно?
     
  20. desertFox

    desertFox Активный пользователь

    С нами с:
    19 окт 2013
    Сообщения:
    62
    Симпатии:
    0
    да я уже понял к чему Вы это), - никто не может знать как лучше будет в моей ситуации, в общем тема закрыта, вопрос решён - отставляю всё как есть

    благодарю всех за помощь, всё учёл, выводы сделал
     
  21. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Это не столь праздный вопрос. Ты назвал переменную так, потому что хочешь это получить из нее. Но возможно имеет смысл в более сложной ситуации, с которой ты столкнешься, пересобрать массив в более удобную форму. Пхп в этом плане очень гибкий язык, т.к. позволяет использовать любые ключи, и в любом порядке. А форычей бояться не надо. Они как раз отработают нужное количество циклов. Ровно столько, сколько есть членов в массиве.

    я так, на будущее.