我有一个读取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
我可以做些什么来实现这一目标?
答案 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
排序: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"
}