Mam tablicę: $messages za pomocą tych danych. (Generowane dynamicznie).

Jak mogę utworzyć plik CSV który zawiera 3 kolumny (TXT, Czas i nazwę) dla każdego TXT_ID z wartościami?

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"
 }

Wynik powinien mieć wiadomości1.CSV i wiadomości2.CSV, ponieważ mamy 2 różnice TXT_ID.

A wyjście pliku CSV powinno być dla wiadomości1.CSV:

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

I na wiadomości2.csv:

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

Próbuję z tym kodem.

$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);

A wynikiem tego kodu jest dużym plikiem CSV, który zawiera całą rozmowę, ale brakuje nazwy kolumny, a nagłówki jest powtarzane.

Na przykład mam generowane rozmowy, a wyjście to:

txt | time
Hi    2017-12-18 01:01:10
txt | time
Yo    2017-12-18 02:10:08    
-2
yuhell 4 czerwiec 2018, 11:41

3 odpowiedzi

Najlepsza odpowiedź

Wypróbuj poniższy kod:

$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) .'</pre><br>';
    $csv_data = array();
    foreach($messages as $key => $value) {
        $csv_data[$value['txt_id']][] = array('txt' => $value['txt'], 'time' => $value['time'], 'name' => $value['name']);
    }
    unset($key, $value);

    if( is_array($csv_data) && count($csv_data) > 0 ) {
        foreach($csv_data as $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
Prasad Wargad 4 czerwiec 2018, 09:17

Wszystkie TXT_ID mają różne wartości w swoich danych współdzielonych CSV. W jaki sposób możesz chcieć tylko 2 plików CSV na podstawie różnych programów TXT_ID?

Czy to jest jak, TXT_ID: 3 i 5 powinno przejść za każdym razem w wiadomości1.CSV i inne szczegóły dotyczące wartości TXT_ID przejdą wiadomości2.csv

0
Prasad Wargad 4 czerwiec 2018, 08:48

To kolejny przykład. Generuje inny plik dla różnych txt_id wartość. Można więc mieć więcej niż dwa pliki, jeśli wartości txt_id są bardziej niż dwa.

<?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
Zhorov 4 czerwiec 2018, 09:51