2012-01-03 24 views
8

--- mảng điểm $ ----câu hỏi về mảng sắp xếp theo thời gian trong 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 
      ) 

    ) 

Tôi có một mảng ở trên và muốn sắp xếp mảng này theo thời gian. Sau đó, tôi sử dụng mã như sau để sắp xếp và kết quả là chính xác. Tuy nhiên, nếu tôi đã thay đổi mã time[$key] = $val[0] thành $time = $val[0], kết quả là sai.

Có ai có thể giải thích điều này cho tôi không? Cảm ơn nhiều!

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

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

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

Thử kiểm tra này: Xóa dòng cuối cùng sử dụng câu lệnh 'time [$ key] = $ val [0]'. Tiếp theo, thay đổi dòng thành '$ time = $ val [0]' và xem '$ time' tạo ra sau vòng lặp. – ladaghini

+0

Điều này là do cách 'mảng_multisort' hoạt động. Nó sắp xếp nhiều mảng và khi mảng '$ time' được sắp xếp, mảng' $ points' được sắp xếp lại theo các chỉ mục mảng trong '$ time'. Tuy nhiên, 'array_multisort' sẽ đến sau' foreach'. – cmbuckley

Trả lời

7

array_multisort loại nhiều hơn một mảng cùng một lúc. Tuy nhiên, nó hoạt động trên một mảng các cột, do đó, cần có vòng lặp foreach để nhận được một cột của các lần. Sau khi xây dựng danh sách này, bạn có thể thực hiện multisort. Mảng $points được sắp xếp theo các chỉ số trong $times, theo this example in the docs.

Tuy nhiên, bạn không cần phải thực hiện sắp xếp bên trong foreach, vì điều đó có nghĩa là sắp xếp xảy ra 4 lần (trong ví dụ của bạn). Nó chỉ cần xảy ra một lần:

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

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

Những gì bạn muốn làm là (ý tưởng cơ bản):

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 

Sau này, bạn có một loạt các point => time cặp, được sắp xếp theo thời gian. Để chỉ lấy các điểm, ví dụ:

$points = array_keys($time); 
+0

Không cần phải làm 'ksort()' bên trong vòng lặp của bạn, mà chỉ cần bổ sung thêm chi phí không cần thiết. Ngoài ra, bạn hoàn toàn thay đổi cấu trúc của mảng. – kba

+0

Bạn đã đúng về điều trong vòng lặp, mặc dù. – Rijk

3

Chức năng ausort() có chức năng gọi lại so sánh. Bạn có thể sử dụng điều này để so sánh hai dấu thời gian.

$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); 

Đoạn mã trên sẽ trở lại

(
    [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

Và làm thế nào để kịch bản này KHÔNG thêm phí không cần thiết? : P Các chuỗi thời gian đã được sắp xếp, toàn bộ điều bạn làm với đi bộ mảng và chuyển đổi chúng thành dấu thời gian là vô lý. Thêm vào đó, bạn vừa phát minh ra cấu trúc '$ arr' mới hay gì đó? Tôi không tìm thấy điều đó trong bài đăng gốc. Cảm ơn cho downvote. – Rijk

+0

@Rijk Trang web này là để giúp đỡ, không bashing. Tôi đã đưa ra cho bạn những lời chỉ trích mang tính xây dựng trên mã của bạn. Nếu có một số chi phí, xin vui lòng cho tôi biết chính xác nơi nó có thể được cải thiện. Và không, tôi không tạo ra cấu trúc '$ arr' mới. – kba

+0

Hoặc tôi hoàn toàn hiểu lầm câu hỏi, hoặc tôi đã nói với bạn. Đó cũng là câu trả lời của tôi. – Rijk

Các vấn đề liên quan