За последние 24 часа нас посетили 22298 программистов и 1036 роботов. Сейчас ищут 665 программистов ...

Преобразовать многомерный массив в одномерный с учетом ключей.

Тема в разделе "Сделайте за меня", создана пользователем Denis_u, 21 янв 2019.

Метки:
  1. Denis_u

    Denis_u Новичок

    С нами с:
    4 фев 2017
    Сообщения:
    4
    Симпатии:
    2
    Задача: Из неизвестного многомерного массива создать одномерный, в котором ключами будут строки вложенности массива.
    Пример:
    Из: [ 'w1' => [ ['a'=>[50,100], ['b=>[10,20], ['c'=>[1,5] ] ],
    'w2' => 1000,
    'w3' => [ 'i' =>40, 'j'=>[50, [ .a.=>10, .b.=>100 ] ] ], ...
    ];
    В: [ 'w1.a.0' => 50,
    'w1.a.1' => 100,
    'w1.b.0' => 10,
    'w1.b.1' => 20,
    'w1.c.0' => 1,
    'w1.c.1' => 5,
    'w2' => 1000,
    'w3.i' => 40,
    'w3.j.0' => 50,
    'w3.j.1.a' => 10,
    'w3.j.1.b' => 100, ...
    ];
    Помогите пожалуйста это реализовать, желательно рекурсивной функцией.
     
  2. Denis_u

    Denis_u Новичок

    С нами с:
    4 фев 2017
    Сообщения:
    4
    Симпатии:
    2
    Написал сам.

    PHP:
    1. function f($v,$k=null){
    2.   $res = [];
    3.   $key = is_null($k) ? '' : $k.'.';
    4.   if(is_array($v)){
    5.     foreach($v as $k2=>$v2){
    6.         if(is_array($v2)){
    7.             $i = f($v2,($key.$k2));
    8.             $res = array_merge($res,$i);        
    9.         }else{
    10.             $res = array_merge($res,[($key.$k2)=>$v2]);
    11.         }
    12.     }
    13.   }else{  
    14.     $res = [$key=>$v];
    15.   }
    16.   return $res;
    17. }
    18.  
    19. Пример:
    20. $arr = [
    21.   'w1' => [ 'a'=>[50,100], 'b'=>[10,20], 'c'=>[1,5]  ],
    22.   'w2' => 1000,
    23.   'w3' => [ 'i' =>40, 'j'=>[50, [ 'a'=>10, 'b'=>100 ] ] ]
    24. ];
    25. print_r(f($arr));
    Результат:
    Array
    (
    [w1.a.0] => 50
    [w1.a.1] => 100
    [w1.b.0] => 10
    [w1.b.1] => 20
    [w1.c.0] => 1
    [w1.c.1] => 5
    [w2] => 1000
    [w3.i] => 40
    [w3.j.0] => 50
    [w3.j.1.a] => 10
    [w3.j.1.b] => 100
    )
     
    #2 Denis_u, 21 янв 2019
    Последнее редактирование модератором: 22 янв 2019
    _ne_scaju_ и Fell-x27 нравится это.