将键=>值添加到PHP数组?

时间:2018-08-19 18:34:00

标签: php arrays

我试图将键'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 ];

任何帮助将不胜感激。

蒂姆

4 个答案:

答案 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;
   }