使用php

时间:2017-09-13 13:33:14

标签: php csv sorting

背景

我有一个读取csv文件的php脚本。此csv文件包含列。最后两列是日期和时间

我需要做的是按日期和时间列按升序排序此数据

我的PHP脚本:

$data = file("myfile.csv"); 
$string = ""; 

for($i = 1; $i < count ( $data ); $i ++)
{ 
   $info1 = str_getcsv($data [$i],",",'');

    $string .= $info1 [4]  .  "," ; //colomns 1 in position 4 in csv file
    $string .= $info1 [6]  .  "," ; //colomns 2 in position 6 in csv file
    $string .= $info1 [7]  .  "," ; //colomns 3 in position 7 in csv file

    //colomns 4 --this colomn contain date like this format (2/8/2016)
     $string .= $info1 [2]  .  "," ;  
    //colomns 5 --this colomn contain timelike this format (12:30 AM) 
    $string .= $info1 [10];          



  $string .= "\n";
 }  

会生成以下内容:

mark,mark,456345,5/10/2016,9:00 AM
mordl,mordl,23564,5/10/2016,1:00 PM
corten,corten,3216589,5/10/2016,12:00 PM
jack,jack,123645,5/10/2016,8:00 AM
olemn,olemn,29845155,5/10/2016,2:00 PM
jab,jab,457362,5/10/2016,10:45 AM
monk,monk,326251,5/10/2016,3:00 PM

我需要按照这样排序:

jack,jack,123645,5/10/2016,8:00 AM
mark,mark,456345,5/10/2016,9:00 AM
jab,jab,457362,5/10/2016,10:45 AM
corten,corten,3216589,5/10/2016,12:00 PM
mordl,mordl,23564,5/10/2016,1:00 PM
olemn,olemn,29845155,5/10/2016,2:00 PM
monk,monk,326251,5/10/2016,3:00 PM

我可以做些什么来实现这一目标?

1 个答案:

答案 0 :(得分:0)

使用usort

usort()是PHP的原生函数,用于对PHP数组进行排序。它可以用来帮助你。

首先,为了使用usort(),您需要一个数组,因此您需要先将数据推送到数组中,而不是将其推送到字符串。

设置数组:

这部分很容易。您需要做的就是初始化一个数组并使用 array_push()

以二维方式将数据推入其中

像这样启动脚本:

$data = file( "myfile.csv" );

$first_dimension = array();
$second_dimension = array();

for($i = 1; $i < count ( $data ); $i ++)
{ 
  $info1 = str_getcsv( $data[ $i ], "," , '' );

  $second_dimension = array( $info1[4], $info1[6], $info1[7], $info1[2], $info1[10] );
  array_push( $first_dimension, $second_dimension );
}

解释

$first_dimension数组将包含所有数据,我们将在对数据进行排序时使用此数组

$second_dimension数组暂时包含来自一行的所有数据。对于for循环second_dim中的每次迭代,将更新当前行

$second_dim = array()循环中的for赋值将从4 th ,6 th 中的数据中生成一个数组,7 <分别在$info1中的sup> th ,2 nd 和10 th 元素

array_push( $first_dimension, $second_dimension )循环中的for将$ second_dim添加为$first_dim的元素,因此创建了一个二维数组。

2维的点是每行之间存在物理隔离,因此当我们对$first_dimension数组进行排序时,我们将有实际排序的行。

将新行字符推送到字符串输出时它也会派上用场!

通过定义比较函数准备排序:

usort()需要2个参数:一个要排序的数组,以及一个用于确定顺序的回调比较函数。

比较功能需要为 前面的 元素返回一个负数,为 成功 元素。这意味着当比较2行时,首先出现的行需要为负数,因为之前排在第二行,而反之亦然

这将是您脚本中使用的一个很好的比较器(在for循环之后添加它):

function compare($row_a, $row_b)
{
    $date_a = date_create( $row_a[3] ) //$info1[2]
    $date_b = date_create( $row_b[3] ) //$info1[2]
    $time_a = date_create( $row_a[4] ) //$info1[10]
    $time_b = date_create( $row_b[4] ) //$info1[10]

    $day_diff = intval( date_diff( $date_a, $date_b )->format( "%R%a" ) )
    $hour_diff = intval( date_diff( $time_a, $time_b )->format("%R%h"))
    $min_diff = intval( date_diff( $time_a, $time_b )->format("%R%i"))
    $time_diff = $hour_diff * 60 + $min_diff;

    if( datediff !== 0 ){
        //if $date_b is a day later than $date_a, then $day_diff will be positive
        //otherwise $day_diff will be negative
        return $day_diff;
    }else{
        //if $time_b is a time later than $time_a, then $time_diff will be positive
        //otherwise $time_diff will be negative
        //if the dates and times are the same, it will return 0
        return $time_diff;
    }
}

解剖此比较器:

在这个比较器中,我们并排比较$first_dimension内的两行,并确定一行应该在另一行之前还是在另一行之后。

我们通过从该行获取日期(在第3列中)和时间(在第4列中)来完成此操作。

然后我们使用PHP的date_diff()函数来比较每个时间。

注意: date_diff()要求参数为php日期对象;我们使用date_create()函数创建那些。

usort排序:

API:

usort ( $array , $comparator_name )

<强>实施

usort( $first_dim, "compare" );

将数组转储为字符串:

要转储内容,只需使用PHP的本机implode()函数将每行的元素连接成一个字符串,每个元素用逗号分隔

var $string = "";

for($i = 1; $i < count ( $first_dimension ); $i ++)
{ 
    $string .= implode( ",", $first_dimension[$i] );
    $string .= "\n"
}