Как преобразовать массив в список массивов для экспорта CSV с помощью FputCSV?

Мне нужно преобразовать массив с несколькими результатами в файл CSV, но я изо всех сил пытаюсь получить действительный вывод. После некоторой отладки я понял, что не генерирую допустимый список массивов для fputcsv для итерации .

Прежде всего, вот наглядный пример var_dump моего массива:

object(stdClass)#83 (3) {
  ["Username"]=>
  string(8) "username"
  ["FullName"]=>
  bool(false)
 ["ContactPhoneNumber"]=>
  bool(false)

object(stdClass)#84 (3) {
  ["Username"]=>
  string(8) "username2"
  ["FullName"]=>
  bool(false)
 ["ContactPhoneNumber"]=>
  bool(false)

object(stdClass)#85 (3) {
  ["Username"]=>
  string(8) "username3"
  ["FullName"]=>
  bool(false)
 ["ContactPhoneNumber"]=>
  bool(false)

И это код, который я пробовал после некоторого исследования того, как преобразовать массив в CSV:

$file = fopen($CsvFile, 'w');
fputcsv($file, array_keys($HeaderFields)); // Headers
$data = array($DataRecord);

foreach ($data as $row) {
   $row = [];
   array_walk_recursive($row, function ($item) use (&$row) {
      $row[] = $item;
   });
   fputcsv($file, $row);
}

fclose($file);

Я также попытался использовать стандартный пример из fputcsv:

$file = fopen($CsvFile, 'w');
$data = array($DataRecord)
foreach ($data as $row) {
   fputcsv($file, $row);
}
fclose($file);

Очевидно, я делаю что-то очень неправильно и не могу создать правильный формат для вставки нескольких строк массива в CSV-файл.

Если я заменю свой массив $data на это:

$data = array(array('Data 11', 'Data 12', 'Data 13', 'Data 14', 'Data 15'));

Тогда fputcsv работает как положено.

Итак, что мне нужно, так это преобразовать мой массив в этот формат, чтобы fputcsv мог перебирать его и сохранять каждую строку.

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

Спасибо


person Optimus Servers    schedule 12.02.2021    source источник
comment
У вас есть объект, а не массив, поэтому он не работает. Вам нужно преобразовать каждый объект в массив для использования с fputcsv. Взгляните на stackoverflow.com/questions/52933052/   -  person cOle2    schedule 12.02.2021


Ответы (1)


Просто приведите объекты к массивам с помощью (array):

$file = fopen($CsvFile, 'w');
fputcsv($file, get_object_vars(reset($data)));

foreach ($data as $row) {
   fputcsv($file, (array)$row);
}
fclose($file);

Если свойства объекта и $HeaderFields не совпадают, используйте вместо них $HeaderFields.

person AbraCadaver    schedule 12.02.2021
comment
Большое спасибо, это работает идеально !!! Я боролся с этим часами, так как я только начал с php, поэтому сэкономил свой день :) - person Optimus Servers; 12.02.2021