2012-01-03 44 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