【问题标题】:Transpose csv file data [duplicate]转置csv文件数据[重复]
【发布时间】:2015-07-17 22:04:37
【问题描述】:

我需要帮助在 PHP 中将 keys 分配给 array

我的代码是:

//First I make an array of a csv file
$file="C:\path-to-csv\file.csv";
$csv= file_get_contents($file);
$array = array_map("str_getcsv", explode("\n", $csv));

array

//echo json_encode($array);
["0","20150717","2:57:00","1437145020","1.56084","1.56096","1.56084","1.56094","5"],
["1","20150717","2:56:00","1437144960","1.56071","1.56089","1.56071","1.56089","9"],
["2","20150717","2:55:00","1437144900","1.5607","1.5607","1.56064","1.56064","2"], //continue

根据$array 的结果,我需要将特定的key 分配给特定的列,并创建一个新的array$newArray”。因此,结果如下所示:

//$newArray should print:
"ID" :  [0, 1, 2],                      //I would like delete this value
"n"  :  [20150717, 20150717, 20150717], //I would like delete this value
"d"  :  [2:57:00, 2:56:00, 2:55:00],    //I would like delete this value
"t"  :  [1437145020, 1437144960, 1437144900], //column 4
"o"  :  [1.56084, 1.56071, 1.5607],     //column 5
"h"  :  [1.56096, 1.56089, 1.5607],     // column 6
"l"  :  [1.56084, 1.56071, 1.56064],    // column 7
"c"  :  [1.56094, 1.56089, 1.56064],    //column 8
"v"  :  [5, 9, 2]                      //column 9

我曾尝试通过循环和一些函数(例如 array_fill_keysarray_column)来完成此操作,但我无法获得所需的结果。如果您能帮助我,我将不胜感激,$array 有 1000 多个条目,因此优化代码执行速度非常重要,而且老实说超出了我的知识范围,我在 Google 中没有看到任何东西可以帮助我完成这个. 谢谢你的时间,对不起我的语法。

【问题讨论】:

  • 一种优化方法是使用循环和fgetcsv() 而不是$csv= file_get_contents($file);.... 因为您仍然需要大量内存来存储1000 个条目——相当于@987654337 @
  • 看到这个问题,我猜它可能会有所帮助:stackoverflow.com/questions/797251/…
  • @buff 是的,我几个小时前看到了,但我无法将它转移到我的代码中,我会继续阅读......无论如何谢谢:)!

标签: php arrays transpose


【解决方案1】:

如果你使用的是 PHP 5.5,你可以使用array_column:

$newArray = array(
    't' => array_column($array, 3),
    'o' => array_column($array, 4),
    'h' => array_column($array, 5),
    ...
);

如果您使用的是较旧的 PHP,您可以在 Is there a function to extract a 'column' from an array in PHP? 找到它的 PHP 实现

【讨论】:

  • 我选择这个答案是最好的,因为它需要0.06900 而@JungleZombie 的答案需要0.12100 都很好,所以非常感谢你的帮助。
【解决方案2】:

编辑差不多,

对于 foreach 循环来说,超过 1000 个条目似乎并不多。

$keys = array('t','o','h','l','c','v');    
$newArray = array();

foreach ($array as $j) {
    $r = array_slice($j, 3);
    foreach ($r as $i => $v) $newArray[$keys[$i]][] = $v*1; 
}

Json 编码的结果将是

"t":[1437144900,1437144900,1437145020],
"o":[1.5607,1.5607,1.56084],
"h":[1.5607,1.5607,1.56096],
"l":[1.56064,1.56064,1.56084],
"c":[1.56064,1.56064,1.56094],
"v":[2,2,5]

运行一个包含 10.000 个条目的数组需要

0.020426

您可以在PhpFiddle 上测试自己。

【讨论】:

    猜你喜欢
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 2021-12-27
    • 2017-10-01
    • 1970-01-01
    相关资源
    最近更新 更多