我试图将键'username'的值添加为'johnsmith'到每个数组,但是无法使其正常工作。
以下是生成数组的代码:
foreach($rows as $row)
{
$csv[] = array_combine($header, $row);
}
这是数组输出:
[0] => Array (
[Date] => 4/22/2018
[Calories Burned] => 3,178
[Steps] => 9,966
[Distance] => 4.86
[Floors] => 8
[Minutes Sedentary] => 762
[Minutes Lightly Active] => 204
[Minutes Fairly Active] => 79
[Minutes Very Active] => 51
[Activity Calories] => 1,778
)
[1] => Array (
[Date] => 4/23/2018
[Calories Burned] => 3,284
[Steps] => 9,671
[Distance] => 4.69
[Floors] => 9
[Minutes Sedentary] => 805
[Minutes Lightly Active] => 180
[Minutes Fairly Active] => 101
[Minutes Very Active] => 68
[Activity Calories] => 1,903
)
[2] => Array (
[Date] => 4/24/2018
[Calories Burned] => 3,714
[Steps] => 12,312
[Distance] => 5.92
[Floors] => 6
[Minutes Sedentary] => 676
[Minutes Lightly Active] => 239
[Minutes Fairly Active] => 131
[Minutes Very Active] => 84
[Activity Calories] => 2,462
)
我尝试了以下代码,但是它只是覆盖了数组:
$csv += [ "username" => johnsmith ];
任何帮助将不胜感激。
蒂姆
答案 0 :(得分:5)
构建数组时
$headers[] = 'username'; //add the key to the end of your headers
foreach($rows as $row){
$row[] = 'johnsmith'; //add value to the end of the row.
//now combine them.
$csv[] = array_combine($header, $row);
}
一个警告词是array_combine
会让您到这儿,两个数组的长度必须相同。因此,通过更改$row
,您将添加一些可能不在标题中的内容,如果标题没有用户名,则必须添加它。
您还可能要保持$header
与$csv
子数组同步。以后生活会更轻松。
当您将它们组合在一起(进行解释)
$headers = [
"Date",
"Calories Burned",
"Steps",
"Distance",
"Floors",
"Minutes Sedentary",
"Minutes Lightly Active",
"Minutes Fairly Active",
"Minutes Very Active",
"Activity Calories"
];
$row = [
"4/23/2018",
"3,284",
"9,671",
"4.69",
"9",
"805",
"180",
"101",
"68",
"1,903"
];
这些结合起来很好,但是如果您添加
$row = [
"4/23/2018",
"3,284",
"9,671",
"4.69",
"9",
"805",
"180",
"101",
"68",
"1,903",
"username" => "johnsmith"
];
将其与$headers
结合使用时会出错,因为$row
比$headers
长1。但是,如果将标题添加到末尾,则将数据添加到该行的末尾。一切都很好,因为它们的长度相同。
数组合并是一个很棒的功能,但是使用它可能有点讨厌。
警告:
其他解决方案可能会添加数据,但是请想一想如果会为此创建CSV文件。因为他们还没有修改标题行。当你做
fputcsv($f, $header);
您的标题将会很短。
如果您只是在读取CSV文件,则可以不更改标题就可以了。但是请记住,如果将它们(标头)用于其他任何用途,它们将与您的数据不同步。
例如:即使在阅读时,您也可以将标题行用于表中的列以显示数据,但您会发现自己短了一个标题。
仅基于您如何命名变量,看起来您可能正在从数据库中提取数据并从中创建CSV文件?在这方面我可能是错的,但是如果是这种情况,您可以再简化一点。
作为奖励
header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename=example.csv');
header('Pragma: no-cache');
$f = fopen('php://output'); //PHP stream wrapper
$headers[] = 'username';
fputcsv($f, $headers);
foreach($rows as $row){
$row[] = 'johnsmith'; //add value to the end of the row.
fputcsv($f, $row);
}
这样做是跳过创建一个单独的数组和一个“真实”文件。
优点和缺点之一
优势
缺点
如果您不这样做,则可以在其他地方使用它。
我做的主要工作之一就是创建CSV文件,我每天都在处理它们。所以我有大约5年的阅读和写作经验。这就是我所知道的。
干杯!
答案 1 :(得分:2)
您必须将其分别插入每一行:
foreach($rows as $row) {
$csv[] = array_merge(
array_combine($header, $row),
array('username' => $johnsmith, 'anything' => 'else')
);
}
答案 2 :(得分:1)
我一直很喜欢一个解决方案,该方案应尽可能少地修改现有代码,所以这是我的:
var custom = function() {
"use strict";
return {
class: function(constructor,prototype) {
constructor.prototype = prototype;
return constructor;
},
class_extends: function(bases,constructor,prototype) {
for (var i = 0; i < bases.length; ++i) {
var base = bases[i];
for (var property in base.prototype) {
if (!prototype[property]) {
prototype[property] = base.prototype[property];
}
}
}
function bundledConstructor() {
for (var i = 0; i < bases.length; ++i) {
bases[i].apply(this,arguments);
}
constructor.apply(this,arguments);
}
constructor.prototype = prototype;
bundledConstructor.prototype = prototype;
return bundledConstructor;
}
};
}();
void function() {
"use strict";
var Base_1 = custom.class(
// Constructor function
function() {
},
// Prototype, shared between class instances
// use for constant values & functions
{
overloadedFunction: function() {
console.log("This is from base 1");
},
base_1_function: function() {
console.log("This is from base 1");
}
}
);
var Base_2 = custom.class(
function() {
},{
base_2_function: function() {
console.log("This is from base 2");
}
}
);
/*
Derrived inherits properties, constants & functions from base_1 & base_2
if anything is redeclared in Derrived, it is considered overloaded
(When a new Derrived object is made, the constructors for base_1 & base_2 are called first)
*/
var Derrived = custom.class_extends([Base_1,Base_2],
function() {
},{
overloadedFunction: function() {
console.log("This is from derrived");
}
}
);
onload = function() {
var derrived = new Derrived();
derrived.base_1_function();
derrived.base_2_function();
derrived.overloadedFunction();
}
}();
说明:只需将其他任何值作为数组添加到foreach ($rows as $row) {
$csv[] = array_combine($header, $row) + ["username" => "johnsmith"];
}
的结果中即可。
答案 3 :(得分:0)
这里是一个例子:
foreach($rows as $row) {
$newArray=array_combine($header, $row);
$newArray["username"]="johnsmith";
$csv[] = $newArray;
}