Как преобразовать многомерный массив в одномерный массив?

#php #arrays #multidimensional-array

#php #массивы #многомерный массив

Вопрос:

Я хочу превратить (в PHP) что-то вроде

 (["a"] => (
    ["x"] => "foo",
    ["y"] => "bar"),
["b"] => "moo",
["c"] => (
    ["w"] => (
        ["z"] => "cow" )
        )
)
  

в

 (["a.x"] => "foo",
["a.y"] => "bar",
["b"] => "moo",
["c.w.z"] => "cow")
  

Как мне этого добиться?

Комментарии:

1. это только 3 уровня глубины или произвольные уровни глубины?

2. Глубина составляет произвольные уровни, хотя она редко превышает 4 уровня.

Ответ №1:

Вы могли бы создать рекурсивную функцию:

 function flatten($arr, amp;$out, $prefix='') {
    $prefix = $prefix ? $prefix . '.' : '';
    foreach($arr as $k => $value) {
        $key =  $prefix . $k;
        if(is_array($value)) {
            flatten($value, $out, $key);
        }
        else {
            $out[$key] = $value;
        }
    }
}
  

Вы можете использовать его как

 $out = array();
flatten($array, $out);
  

Комментарии:

1. Как мне сохранить полный путь к массиву в качестве идентификатора объектов с помощью этого?

2. @Cobra: Я не понимаю, что ты имеешь в виду. Пожалуйста, уточните.

3. $key = $prefix ? $prefix . ‘.’ . $k : $ k; Фактически в этой строке уже сохранен полный путь к массиву. 1 за это решение.

Ответ №2:

У вас здесь есть кое-что интересное:http://davidwalsh.name/flatten-nested-arrays-php

Комментарии:

1. На правильном пути, но это само по себе не создаст ключей, как хочет OP