Многомерный массив в CSV - при этом А) сохранение ключей И Б) разная длина массивов - PullRequest
0 голосов
/ 10 марта 2020

Ответы на "нормальное" уплощение MultidimArrays я нашел в изобилии - но я не смог найти решение, которое работает с этими двумя предостережениями: A) сохранить ключи и B) различную длину массивов

например, I Я пытаюсь преобразовать это:

array(2) {
  [0]=>
  array(5) {
    ["Name"]=>
    string(9) "Max Muster"
    ["phoneNumbers"]=>
    array(3) {
      [0]=>
      string(7) "1234567"
      [1]=>
      string(7) "2345678"
    }
    ["manager"]=>
    string(13) "None - is CEO"
  }
  [1]=>
  array(5) {
    ["Name"]=>
    string(9) "Ada Brown"   
    ["phoneNumbers"]=>
    array(1) {
      [0]=>
      string(7) "AJP4564"
    }
    ["manager"]=>
    string(10) "Max Muster"
  }

в это:

Name, Max Muster, phoneNumbers, 1234567, 2345678, manager, None - is CEO, Name, Ada Brown, phoneNumbers, AJP4564, manager, Max Muster

... для использования в CSV

Но это (короткое, хорошее) решение теряет ключи:

foreach ($arrayMultiDim as $onePerson) {
$arrayOneDim = [];
array_walk_recursive(
    $onePerson,
    function ($oneDim) use (&$arrayOneDim) {
        $arrayOneDim[] = $oneDim . ', ';
    }
);
}

Бонус: где я могу добавить '' или ';' создать новую строку перед записью в CSV? И как мне избежать ',' после последнего значения в строке?

Для идеального создания sth. как это:

Name, Max Muster, phoneNumbers, 1234567, 2345678, manager, None - is CEO
Name, Ada Brown, phoneNumbers, AJP4564, manager, Max Muster

1 Ответ

1 голос
/ 10 марта 2020

Функция array_walk_recursive будет игнорировать родительские ключи. Поэтому я думаю, что лучший способ - написать новую рекурсивную функцию, которая не будет их игнорировать. Функция array_to_csv, приведенная ниже, выполняет итерацию по части вашего массива, добавляет ключ к выводу (если это не цифра c, потому что: номера телефонов будут иметь 0 и 1 et c в качестве ключей) , Затем он проверяет, является ли фактическое значение массивом, и вызывает рекурсивную функцию. Если это не массив, он добавляет значение к выводу. После этого он возвращает результат.

Функция:

function array_to_csv( $array, &$out = array() ) {
  foreach( $array as $key => $value ) {
    if( !is_numeric( $key ) ) {
      $out[] = $key;
    }
    if( is_array( $value ) )  {
      array_to_csv( $value, $out );
    } else {
      $out[] = $value;
    }
  }
  return $out;
}

В этом foreach он перебирает ваш массив и вызывает функцию с каждым элементом (или line) вашего массива. Затем он возвращает возврат и добавляет ; в конце.

Вызов функции:

$csv_array = array();
foreach( $arrayMultiDim as $array ) {
  $csv_array[] = implode(', ', array_to_csv( $array ) ) . ';';
}

Ваш результат сохраняется в $csv_array

Array
(
    [0] => Name, Max Muster, phoneNumbers, 1234567, 2345678, manager, None - is CEO;
    [1] => Name, Ada Brown, phoneNumbers, AJP4564, manager, Max Muster;
)
...