Создание CSV-файла с использованием данных из базы данных, дает «мозаичные, беспорядочные» результаты

#php #arrays #laravel #fputcsv

#php #массивы #laravel #fputcsv

Вопрос:

Первая часть кода работает нормально, но вторая (отображение результатов) работает неправильно. Если я вставляю $slugs = explode(',', $slugs) внутрь foreach ($pma...) , это выдает explode() expects parameter 2 to be string, array given ошибку. Если я сохраню его в том виде, в каком он есть сейчас, он работает, но результаты выдаются в режиме «мозаичный, беспорядочный» с несколькими одинаковыми результатами. Даже print_r() показывает 800 результатов в одной строке (это нонсенс).

Как это исправить?

 $data = fopen('php://output', 'w');

$fields = rtrim($_GET['fieldnames'], ",");
$slugs = rtrim($_GET['slugs'], ",");

$fieldnames = array();
$fieldslugs = array();

$pma = DB::table... // long query

$fields = explode(',', $fields);
   foreach ($fields as $field) {
      $fieldnames[] = $field;
}

fputcsv($data, $fieldnames);


$slugs = explode(',', $slugs);

foreach ($pma as $p) {

  foreach ($slugs as $slug) {
    $fieldslugs[] = $p->$slug;
  }

  fputcsv($data, $fieldslugs);

}
  

Извините за плохой английский и спасибо за любые ответы!

Ответ №1:

Попробуйте это:

 foreach ($pma as $p) {
  $fieldslugs = [];
  foreach ($slugs as $slug) {
    $fieldslugs[] = $p->$slug;
  }

  fputcsv($data, $fieldslugs);

}
  

Вам необходимо сбрасывать массив для каждой итерации, иначе он будет продолжать заполнять один и тот же массив и, таким образом, добавлять новые результаты строк к каждой строке csv.

Ответ №2:

Вам нужно добавить $fieldslugs = []; перед foreach

 $fieldslugs = [];
foreach ($slugs as $slug) { 
    $fieldslugs[] = $p->$slug;
}

fputcsv($data, $fieldslugs);
  

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

1. Спасибо. Это работает. Однако @riekelt ответил с объяснением, поэтому я приму его ответ.