2012-01-03 51 views
8

---数组$点----问题的时间在PHP

Array 
    (
     [0] => Array 
      (
       [0] => 2011-10-02 05:30:00 
       [1] => 20 
      ) 

     [1] => Array 
      (
       [0] => 2011-10-04 09:30:00 
       [1] => 12 
      ) 

     [2] => Array 
      (
       [0] => 2011-10-01 13:30:00 
       [1] => 25 
      ) 

     [3] => Array 
      (
       [0] => 2011-10-03 02:30:00 
       [1] => 31 
      ) 

    ) 

我有一个数组在上面,想排序数组的时间。然后我使用下面的代码进行排序,结果是正确的。但是,如果我将代码time[$key] = $val[0]更改为$time = $val[0],结果是错误的。

有没有人可以向我解释这个?非常感谢!

foreach($points as $key=>$val){ 

     $time[$key] = $val[0]; 

     array_multisort($time, SORT_ASC, $points); 
    } 
+0

你可以做个试验:删除最后一行('array_mu ...'),其注释掉什么的,那么'foreach'循环之后打印出来'$ time'使用'time [$ key] = $ val [0]''语句。接下来,将该行更改为'$ time = $ val [0]'并查看循环后生成的'$ time'。 – ladaghini 2012-01-03 16:20:04

+0

这是因为'array_multisort'的工作方式。它对多个数组进行排序,当'$ time'数组进行排序时,'$ points'数组根据'$ time'中的数组索引重新排序。尽管'array_multisort'应该在'foreach'之后。 – cmbuckley 2012-01-03 16:31:30

回答

7

array_multisort种类多于一个阵列在一次以上。但是,它适用于一列数组,因此需要foreach循环来获取一列时间。建立这个列表后,你可以执行multisort。 $points阵列根据$times中的索引按照this example in the docs进行排序。

但是,您不需要在foreach内执行排序,因为这意味着排序会发生4次(在您的示例中)。它只需要发生一次:

foreach ($points as $key => $val) { 
    $time[$key] = $val[0]; 
} 

array_multisort($time, SORT_ASC, $points); 
-2

你想要做的是什么(基本想法):

foreach($points as $key=>$val){ 
    $time[$val[1]] = $val[0]; // $time will be an array of [ point => time ] pairs 
} 
asort($time); // sorts the array and maintains indexes 

此之后,你有point => time双阵列,按时间排序。为了得到公正的点,比如做

$points = array_keys($time); 
+0

没有必要在循环中执行'ksort()',这只会增加额外的不必要开销。另外,你完全改变了数组的结构。 – kba 2012-01-03 16:17:28

+0

虽然你在循环中是对的。 – Rijk 2012-01-03 16:30:06

3

功能ausort()需要一个比较回调函数。您可以使用它来比较两个时间戳。

$arr = array(
     array('2011-10-02 05:30:00','20'), 
     array('2011-10-04 09:30:00','12'), 
     array('2011-10-01 13:30:00','25'), 
     array('2011-10-03 02:30:00','31') 
); 

function timecomp($a,$b) 
{ 
    // Subtracting the UNIX timestamps from each other. 
    // Returns a negative number if $b is a date before $a, 
    // otherwise positive. 
    return strtotime($b[0])-strtotime($a[0]); 
} 
uasort($arr,'timecomp'); 

print_r($arr); 

上面的代码将返回

(
    [1] => Array 
     (
      [0] => 2011-10-04 09:30:00 
      [1] => 12 
     ) 

    [3] => Array 
     (
      [0] => 2011-10-03 02:30:00 
      [1] => 31 
     ) 

    [0] => Array 
     (
      [0] => 2011-10-02 05:30:00 
      [1] => 20 
     ) 

    [2] => Array 
     (
      [0] => 2011-10-01 13:30:00 
      [1] => 25 
     ) 

) 
+1

该脚本如何不增加不必要的开销? :P时间字符串已经可以排序,整个事情你走阵列和转换为时间戳是荒谬的。另外,你刚发明了一个新的'$ arr'结构或者什么?我在原文中没有找到。感谢downvote。 – Rijk 2012-01-03 16:26:45

+0

@Rijk这个网站是为了帮忙,而不是抨击。我的代码给了你建设性的批评。如果有一些开销,请告诉我具体哪些地方可以改进。不,我没有创建一个新的'$ arr'结构。 – kba 2012-01-03 16:33:30

+0

要么我完全误解了这个问题,要么我已经告诉过你了。这也是我的答案。 – Rijk 2012-01-03 16:36:17