Массив в CSV-файл, используя тот же идентификатор в PHP - PullRequest
0 голосов
/ 04 июня 2018

У меня есть массив под названием: $messages с этими данными.(Генерируется динамически).

Как создать файл CSV, содержащий 3 столбца (txt, время и имя) для каждого txt_id со значениями?

array(3) {
  [0]=>
  array(5) {
    ["txt"]=>
    string(3) "Hey"
    ["txt_id"]=>
    string(1) "5"
    ["name"]=>
    string(8) "John Doe"
    ["id_user"]=>
    string(1) "5"
    ["time"]=>
    string(19) "2017-12-15 08:28:47"
  }
  [1]=>
  array(5) {
    ["txt"]=>
    string(8) "Hey John"
    ["txt_id"]=>
    string(1) "5"
    ["name"]=>
    string(13) "Gilles Ragout"
    ["id_user"]=>
    string(1) "58"
    ["time"]=>
    string(19) "2017-12-15 08:37:21"
  }
 [2]=>
 array(5) {
   ["txt"]=>
   string(6) "What ?"
   ["txt_id"]=>
   string(2) "12"
   ["name"]=>
   string(11) "Noémie Nail"
   ["id_user"]=>
   string(1) "56"
   ["time"]=>
   string(19) "2017-05-10 05:12:36"
 }

Таким образом, результат должен бытьMessages1.csv и Messages2.csv, потому что у нас есть 2 разные txt_id.

И вывод файла csv должен быть для Messages1.csv:

txt            | time                | name
Hey              2017-12-15 08:28:47  John Doe
Hey John         2017-12-15 08:37:21  Gilles Ragout

И для Messages2.csv:

txt            | time                | name
What ?           2017-05-10 05:12:36   Noemie Nail

Я пытаюсь с этим кодом.

$file = fopen('php://temp', 'w');
if (false === $file) {
    die('Failed to create temporary file');
}
foreach ($getUserConv as $conv) {
    fputcsv($file, array_keys($conv));
    fputcsv($file, $conv);
}
rewind($file);
$zip->addFromString(__('Conversations').'.csv', stream_get_contents($file));
fclose($file);

И результатом этого кода является большой CSV-файл, который содержит весь диалог, но имя столбца отсутствует, а заголовки повторяются.

Например, у меня есть Разговоры, которые генерируются, и вывод:

txt | time
Hi    2017-12-18 01:01:10
txt | time
Yo    2017-12-18 02:10:08    

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Попробуйте код ниже:

<code>$messages = array(array('txt' => 'Hey', 'txt_id' => '5', 'name' => 'John Doe', 'id_user' => '5', 'time' => '2017-12-15 08:28:47'),
                      array('txt' => 'Hey John', 'txt_id' => '5', 'name' => 'Gilles Ragout', 'id_user' => '5', 'time' => '2017-12-15 08:37:21'),
                      array('txt' => 'What ?', 'txt_id' => '12', 'name' => 'Noemie Nail', 'id_user' => '56', 'time' => '2017-05-10 05:12:36'));
    echo '<br>messages=<pre>'. print_r($messages, true) .'

';$ csv_data = array ();foreach ($ messages как $ key => $ value) {$ csv_data [$ value ['txt_id']] [] = массив ('txt' => $ value ['txt'], 'time' => $ value ['time'], 'name' => $ value ['name']);} unset ($ key, $ value);if (is_array ($ csv_data) && count ($ csv_data)> 0) {foreach ($ csv_data как $ index => $ data) {if (is_array ($ data) && count ($ data)> 0) {$ file =fopen ('/ tmp / Messages'. $ index. '. csv', 'w');fputcsv ($ file, array_keys ($ data [0]));foreach ($ data as $ key => $ value) {fputcsv ($ file, $ value);} fclose ($ file);unset ($ key, $ value, $ file);}} unset ($ index, $ data);}
0 голосов
/ 04 июня 2018

Это еще один пример.Он генерирует другой файл для другого значения txt_id.Таким образом, возможно иметь более двух файлов, если ваши значения txt_id больше двух.

<?php
// Input values
$messages = array();
$messages[] = array(
    "txt"=>"Hey",
    "txt_id"=>"5",
    "name"=>"John Doe",
    "id_user"=>"1",
    "time"=>"2017-12-15 08:28:47"
);
$messages[] = array(
    "txt"=>"Hey John",
    "txt_id"=>"5",
    "name"=>"Gilles Ragout",
    "id_user"=>"1",
    "time"=>"2017-12-15 08:37:21"
);
$messages[] = array(
    "txt"=>"What ?",
    "txt_id"=>"12",
    "name"=>"Noémie Nail",
    "id_user"=>"56",
    "time"=>"2017-05-10 05:12:36"
);

// Delimiter and different id's. File creation and columns titles.
$delimiter = ',';
$ids = array();
foreach ($messages as $item) {
    $id = $item['txt_id'];
    if (!array_key_exists($id, $ids)) {
        $ids[$id] = $id;
        $file = fopen('messages'.$ids[$id].'.csv', "w");
        $line = array('txt', 'time', 'name');
        fputcsv($file, $line, $delimiter);
        fclose($file);
    }
}

// Data
foreach ($messages as $item) {
    $line = array($item['txt'], $item['time'], $item['name']);
    $id = array_search($item['txt_id'], $ids);
    $file = fopen('messages'.$ids[$id].'.csv', "a");
    fputcsv($file, $line, $delimiter);
    fclose($file);
}

// End
echo 'OK.';
?>
0 голосов
/ 04 июня 2018

все txt_id имеют разные значения в ваших общих данных CSV.Тогда как вы хотите, чтобы только 2 CSV-файла основывались на разных значениях txt_id?

Это похоже на то, что txt_id: 3 и 5 должны идти каждый раз в Messages1.csv, а другие сведения о значении txt_id будут идти в Messages2.csv

...