我有一个名为$messages
的数组,带有这些数据。 (动态生成)。
如何为每个包含值的txt_id创建一个包含3列(txt,时间和名称)的CSV文件?
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文件,其中包含所有会话但缺少列名,并且重复标题。
例如,我生成了Conversations,输出为:
txt | time
Hi 2017-12-18 01:01:10
txt | time
Yo 2017-12-18 02:10:08
答案 0 :(得分:0)
所有txt_id在您的共享csv数据中都有不同的值。那么你怎么能只想要基于不同txt_id的2个csv文件?
是这样的,txt_id:3& 5应该每次都在Messages1.csv&其他txt_id值详细信息将在Messages2.csv
中答案 1 :(得分:0)
尝试以下代码:
$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);
}
答案 2 :(得分:0)
这是另一个例子。它为不同的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.';
?>