многомерный массив в одномерный массив рекурсивно - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть этот многомерный массив

$liste = [[1,2,3],5,[['x','y','z'],true]];

, и я хочу изменить его на один размерный массив

$liste = [1,2,3,5,'x','y','z',true];

, поэтому у меня всегда есть проблема, которая дает мне одинаковую форму

function to_array($list){
    $out=[];
    if(!is_array($list)){
        return $list;
    }else{
        foreach($list as $line){
            $out[]= to_array($line);
        }
    }
    return $out;
}

где проблема в этой рекурсивной функции !!!

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

array_walk_recursive() доставляет желаемый результат из массива неопределенной глубины в одну строку, потому что он посещает только «листовые узлы» - фактически, вам не нужно беспокоиться о проверке, является ли элемент или нетмассив.

array_walk_recursive() не возвращает массив, он возвращает true | false в зависимости от того, был ли сбой.

&$flat - переменнаякоторый "передан по ссылке".Это означает, что $flat может выступать в качестве транспортного средства для передачи данных из области действия функции в область действия функции.По мере прохождения элементов каждое новое значение помещается в $flat с использованием синтаксиса в квадратных скобках.

Это именно то, что эта функция делает лучше всего - используйте ее.

Код: ( Демо )

$liste = [[1, 2, 3], 5, [['x', 'y', 'z'], true]];
array_walk_recursive($liste, function($v) use (&$flat){ $flat[] = $v; });
var_export($flat);

Вывод:

array (
  0 => 1,
  1 => 2,
  2 => 3,
  3 => 5,
  4 => 'x',
  5 => 'y',
  6 => 'z',
  7 => true,
)
0 голосов
/ 17 сентября 2018

Проблема с вашим кодом заключается в том, что вы помещаете результат to_array в $out, когда вы хотите использовать array_merge. Теперь, поскольку для этого требуется, чтобы оба параметра были массивами, когда $list не является массивом, вам необходимо вернуть массив, содержащий индивидуальное значение. Так что измените эти строки:

    return $list;
        $out[]= to_array($line);

Кому:

    return array($list);
        $out = array_merge(to_array($line));

т.е.

function to_array($list){
    $out=[];
    if(!is_array($list)){
        return array($list);
    }else{
        foreach($list as $line){
            $out = array_merge($out, to_array($line));
        }
    }
    return $out;
}

И вы получите желаемый результат:

var_export(to_array($liste));

Выход:

array (
  0 => 1,
  1 => 2,
  2 => 3,
  3 => 5,
  4 => 'x',
  5 => 'y',
  6 => 'z',
  7 => true,
)
...