排序多维数组-PHP
我有一个.csv上传表单,它从文件中获取值并对其进行适当的格式化。或者至少这是我正在努力实现的目标 我试图做的是使用包含在中的名称格式化每个内部数组的排序多维数组-PHP,php,Php,我有一个.csv上传表单,它从文件中获取值并对其进行适当的格式化。或者至少这是我正在努力实现的目标 我试图做的是使用包含在中的名称格式化每个内部数组的6索引,例如: Array ( [0] => Array ( [0] => 2 [1] => 230 [2] => 12 Aug 2013 07:46 AM [3] => 816 [4] => INB [5] => 1.38 [6] => L
6
索引,例如:
Array (
[0] => Array (
[0] => 2
[1] => 230
[2] => 12 Aug 2013 07:46 AM
[3] => 816
[4] => INB
[5] => 1.38
[6] => Leonard
)
)
Array (
[0] => Array (
[0] => 2
[1] => 230
[2] => 12 Aug 2013 07:46 AM
[3] => 816
[4] => INB
[5] => 1.38
[6] => Leonardo
)
[1] => Array(
[0] => 3
[1] => 170
[2] => 12 Aug 2013 07:47 AM
[3] => 170
[4] => OUT (EXTENSION)
[5] => 1.08
[6] => Greg
)
)
因此,这个.csv
文件将包含数千条这些条目,但我正在尝试对其进行格式化,以便所有莱昂纳多的
都将聚集在一起,而不是在发送下载的.csv
文件中到处都是一行,而不是100行
首先让我解释一下如何检索数据。一个while循环
打开文件并遍历整个文件。对数据进行分析和检查,然后将每个阵列存储到:
$collectedData[$i] = $tmpfileop;
$i++;
以下是我现在正在做的事情:
#FUNCTION TO CLEAN DATA
function cleanData(&$str)
{
// escape tab characters
$str = preg_replace("/\t/", "\\t", $str);
// escape new lines
$str = preg_replace("/\r?\n/", "\\n", $str);
// convert 't' and 'f' to boolean values
if($str == 't') $str = 'TRUE';
if($str == 'f') $str = 'FALSE';
// force certain number/date formats to be imported as strings
if(preg_match("/^0/", $str) || preg_match("/^\+?\d{8,}$/", $str) || preg_match("/^\d{4}.\d{1,2}.\d{1,2}/", $str)) {
$str = "'$str";
}
// escape fields that include double quotes
if(strstr($str, '"')) $str = '"' . str_replace('"', '""', $str) . '"';
}
$filename = "call_logs_as_of_" . date('Ymd') . ".xls";
header("Content-Disposition: attachment; filename=\"$filename\"");
header("Content-Type: application/vnd.ms-excel");
$flag = false;
foreach($collectedData as $row) {
if(!$flag) {
// display field/column names as first row
echo implode("\t", array_keys($row)) . "\r\n";
$flag = true;
}
array_walk($row, 'cleanData');
echo implode("\t", array_values($row)) . "\r\n";
}
这很好用,只是格式不正确,我对如何完成我想做的事情感到困惑
建议、想法
David以下内容将数据聚合到由原始数组中的第6个字段键入的关联数组中:
$normalized = array();
foreach($collecteddata as $row) {
if( !isset($normalized[$row[6]] ) {
$normalized[$row[6]] = array();
}
$normalized[$row[6]][] = $row;
}
请注意,这将使内存使用率加倍。最好在您首先阅读CSV的地方实现此功能
另外,当你发布一个问题时,请将你的数据格式化好。数组的原始格式类似于查看一碗字母汤:P您需要在第六栏前订购吗?是的,我想需要。我假设我需要处理整个数组,收集所有相似的名称并将它们存储到一个新数组中?我只需要对第6列中保存的所有名称进行排序,以便它们都保存在一起。要对第6列进行排序,您可以尝试使用以下方法:array\u multisort($ar[6],SORT\u ASC,SORT\u STRING);因此,从第二个空数组开始,遍历数据,并在运行时将其聚合到新数组中。@Sammitch,我一直在尝试,但不确定我做错了什么。尝试将其放入时:
$normalized=$collectedData;foreach($collecteddata as$row){if(!isset($normalized[$row[6]]){$normalized[$row[6]]]=array();}array_walk($row,'cleanData');$normalized[$row[6]]][=$row;echo内爆(“\t”,array_values($row))。“\r\n”;}
它对我来说工作不正常,在导出的文件上,我得到了一个错误。实际上我收回了它,它可以工作,但在导出的文件中似乎没有格式化?到处都是名字。