排序多维数组-PHP

排序多维数组-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

我有一个.csv上传表单,它从文件中获取值并对其进行适当的格式化。或者至少这是我正在努力实现的目标

我试图做的是使用包含在中的名称格式化每个内部数组的
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”;}
它对我来说工作不正常,在导出的文件上,我得到了一个错误。实际上我收回了它,它可以工作,但在导出的文件中似乎没有格式化?到处都是名字。