За последние 24 часа нас посетили 20045 программистов и 1652 робота. Сейчас ищут 774 программиста ...

Функция поиска значения по ключу в многомерном массиве

Тема в разделе "PHP для новичков", создана пользователем Dmitreym, 12 апр 2019.

  1. Dmitreym

    Dmitreym Новичок

    С нами с:
    12 апр 2019
    Сообщения:
    2
    Симпатии:
    0
    Подскажите, есть многомерный ассоциативный массив, нужно из него выводить значение по ключу, сделал функцию из foreach, выглядит страшно и не подходит, если глубина массива меньше заявленной, или нужный ключ находится выше, чем тот что выводится по return

    PHP:
    1. function eventListner ($array, $type){
    2.     // $i = 1;
    3.     // $k = 'k'.$i;
    4.     // $m = 'm'.$i;
    5.     foreach($array as $k1 => $m1)
    6. {
    7. foreach($m1  as  $k2 => $m2)
    8. {
    9. foreach($m2  as  $k3 => $m3)
    10. {
    11. foreach($m3  as  $k4 => $m4)
    12. {
    13. foreach($m4  as  $k5 => $m5)
    14. {
    15. foreach($m5  as  $k6 => $m6)
    16. {
    17. foreach($m6  as  $k7 => $m7)
    18. {
    19. foreach($m7  as  $k8 => $m8)
    20. {
    21. foreach($m8  as  $k9 => $m9)
    22. {
    23. foreach($m9  as  $k10 => $value)
    24. {
    25.      if($k10 == $type)
    26.     return $value;
    27. }}}}}}}}}}
    28. }
    29. echo eventListner($test, 'my_key');
    Пробую сделать через присвоение номера массива через i, в ту сторону вообще иду? Может можно как то по другому упросить код?
     
  2. Babka_Gadalka

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

    С нами с:
    16 фев 2019
    Сообщения:
    162
    Симпатии:
    23
    Адрес:
    Москва, Пушкина, Избушкина, 2й этаж душечка.
    можно
     
  3. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    для таких целей есть рекурсия.
    если искомый ключ не повторяется, то можно сделать так:
    PHP:
    1. function findValueByKey($inputArray, $findKey) {
    2.     foreach ( $inputArray as $key => $value ) {
    3.         if ( $findKey == $key ) {
    4.             return $value;
    5.         } elseif ( is_array( $value ) ) {
    6.             $tmp = findValueByKey($value, $findKey);
    7.             if ( $tmp !== false ) {
    8.                 return $tmp;
    9.             }
    10.         }
    11.     }
    12.     return false;
    13. }
    14. }
    будет работать при условии, что в массиве нет булевых false
    ну и вернет значение первого встретившегося элемента с подходящим ключом.
     
    Dmitreym нравится это.
  4. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Зачем так?
    достаточно просто
    PHP:
    1. } elseif ( is_array( $value ) ) {
    2.     retun findValueByKey($value, $findKey);
    3. }
     
  5. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    не достаточно
    на первом же вложенном массиве всё закончится независимо от того, есть в нём искомый ключ или нет.
     
  6. Vanchot

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

    С нами с:
    23 мар 2019
    Сообщения:
    104
    Симпатии:
    19
    Адрес:
    Ахерон (LV-426)
    > или нужный ключ находится выше, чем тот что выводится по return
    Если имеется ввиду, что значение - не массив (и похоже на то, если выводите результат через echo, как простое значение), то можно так:
    PHP:
    1. function eventListner($array, $type){
    2.     $jsonIterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array),RecursiveIteratorIterator::SELF_FIRST);
    3.     foreach ($jsonIterator as $key => $val){
    4.         if($key == $type && !is_array($val))
    5.             return $val;
    6.     }
    7.     return false;
    8. }
     
    #6 Vanchot, 12 апр 2019
    Последнее редактирование: 12 апр 2019
    Dmitreym нравится это.
  7. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Действительно, чё-т туплю )
     
  8. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Поговорили? :) А теперь главный вопрос откуда этот массив? 90% случаев массив это результат выборки из БД со всеми вытекающими...
     
  9. Dmitreym

    Dmitreym Новичок

    С нами с:
    12 апр 2019
    Сообщения:
    2
    Симпатии:
    0
    Большое спасибо всем за ответы! Вот это то, что нужно:
    Отдельное спасибо за рекурсию, интересная штука буду изучать))