2012-04-05 52 views
5

Tôi hiện đang gặp sự cố trong PHP nơi tôi muốn sắp xếp các bài đăng này theo ngày tạo của chúng để chúng có thể được hiển thị theo thứ tự giảm dần. Tôi đã tìm kiếm một hàm PHP để làm điều này nhưng không có may mắn.Sắp xếp mảng trong một mảng bằng PHP theo ngày giờ

Có giải pháp dễ dàng cho vấn đề này không? Bất kỳ ý tưởng nào cũng sẽ được đánh giá cao :)

array 
     0 => 
     array 
      'post_id' => string '1' (length=1) 
      'user_id' => string '3' (length=1) 
      'post' => string 'this is a post' (length=14) 
      'created' => string '2012-04-05 20:11:38' (length=19) 
    1 => 
     array 
      'post_id' => string '2' (length=1) 
      'user_id' => string '2' (length=1) 
      'post' => string 'this is a post' (length=14) 
      'created' => string '2012-04-05 20:11:38' (length=19) 
    2 => 
     array 
      'post_id' => string '3' (length=1) 
      'user_id' => string '5' (length=1) 
      'post' => string 'this is a post' (length=14) 
      'created' => string '2012-04-05 20:11:38' (length=19) 
+4

Đây có phải là đến từ một cơ sở dữ liệu? Nếu không, tai sao không? – NullUserException

+0

từ mảng này đang được tải ở đâu? – hjpotter92

+3

Đúng, trông nghi ngờ giống như các hàng truy vấn MySQL. 'ORDER BY được tạo ra DESC' –

Trả lời

5

Hãy thử điều này:

<?php 
$a=array(
     0 => 
     array(
      'post_id' => '1', 
      'user_id' => '3', 
      'post' => 'this is a post', 
      'created' => '2012-04-05 20:11:40' 
     ), 
    1 => 
     array(
      'post_id' => '2', 
      'user_id' => '2', 
      'post' => 'this is a post', 
      'created' => '2012-04-05 20:11:39' 
     ), 
    2 => 
     array(
      'post_id' => '3', 
      'user_id' => '5', 
      'post' => 'this is a post', 
      'created' => '2012-04-05 20:11:38' 
     ) 
); 
function cmp($a,$b){ 
    return strtotime($a['created'])<strtotime($b['created'])?1:-1; 
}; 

uasort($a,'cmp'); 
print_r($a); 
?> 
+0

'cmp()' sẽ trả về giá trị âm nếu '$ a' được coi là nhỏ hơn' $ b', giá trị dương nếu '$ a' lớn hơn' $ b' và 0 nếu chúng bằng nhau. – Arjan

+1

cảm ơn, câu trả lời được cập nhật (tôi đã bỏ qua trường hợp tương đương, tôi biết ..) – stewe

+0

Không cần 'strtotime'. Định dạng 'YYYY-MM-DD HH: MM: SS' (24 giờ) chỉ cần hàm' strcmp' để sắp xếp. – m13r

1

Bạn có thể sử dụng strtotime() để chuyển dấu thời gian thành số nguyên.

+2

Và làm thế nào mà sẽ giúp sắp xếp mảng 2D? –

+0

Heh ok, câu hỏi mơ hồ. Tôi nghĩ OP ám chỉ tem của anh ta là Y-d-m. –

+1

Nếu ngày ở định dạng 'Y-d-m', bạn không thể dễ dàng chuyển đổi chúng thành dấu thời gian. Và nếu chúng ở định dạng 'Y-m-d', bạn không cần chuyển đổi chúng. – Arjan

1

Bạn có thể sắp xếp một mảng sử dụng một chức năng tùy chỉnh sắp xếp, như vậy:

function cmp($a, $b) { 
    if($a['created'] < $b['created']) { 
     return 1; 
    } else if ($a['created'] > $b['created']) { 
     return -1; 
    } else { 
     // The only option left is that they are equal 
     return 0; 
    } 
} 

usort($array, cmp); 

Để biết thêm thông tin về usort, kiểm tra php manpage

+1

Điều này sẽ tạo ra một thứ tự tăng dần thay vì giảm dần. – MrCode

+1

Tôi đã cập nhật câu trả lời của mình. May mắn thay nó chỉ là một thay đổi nhỏ. – Arjan

1

Bạn có thể sử dụng chức năng usort() cho phép bạn sắp xếp một mảng dựa trên tiêu chí của riêng bạn.

function cmp($a, $b) 
{ 
    if ($a['created'] == $b['created']) { 
     return 0; 
    } 

    return ($a['created'] < $b['created']) ? 1 : -1; 
} 

usort($myArray, "cmp"); 

print_r($myArray); 

Hoặc nếu bạn muốn chuyển đổi sang một thời điểm:

function cmp($a, $b) 
{ 
    if ($a['created'] == $b['created']) { 
     return 0; 
    } 

    $aInt = strtotime($a['created']); 
    $bInt = strtotime($b['created']); 

    return ($aInt < $bInt) ? 1 : -1; 
} 
2

Sorting mảng các bản ghi/assoc_arrays bởi lĩnh vực mysql datetime quy định và theo lệnh:

function build_sorter($key, $dir='ASC') { 
     return function ($a, $b) use ($key, $dir) { 
      $t1=strtotime(is_array($a)?$a[$key]:$a->$key); 
      $t2=strtotime(is_array($b)?$b[$key]:$b->$key); 
      if($t1==$t2) return 0; 
      return (str_to_upper($dir)=='ASC'?($t1 < $t2):($t1 > $t2)) ? -1 : 1; 
     }; 
    } 


    // $sort - key or property name 
    // $dir - ASC/DESC sort order or empty 
    usort($arr, build_sorter($sort, $dir)); 
Các vấn đề liên quan