2011-06-19 56 views
21

thể trùng lặp:
PHP Sort a multidimensional array by element containing dateMảng lệnh PHP theo ngày?

Tôi có một số dữ liệu từ XML hoặc JSON trong một mảng PHP trông như thế này:

[0]= array(2) { 
    ["title"]= string(38) "Another title" 
    ["date"]= string(31) "Fri, 17 Jun 2011 08:55:57 +0200" 
} 
[1]= array(2) { 
    ["title"]= string(38) "My title" 
    ["date"]= string(31) "Mon, 16 Jun 2010 06:55:57 +0200" 
} 

Những gì tôi muốn làm đặt hàng hai mặt hàng theo ngày.

  1. Có thể sắp xếp theo ngày, khi giá trị sắp xếp nằm trong mỗi mục không?
  2. Tôi có cần chuyển đổi định dạng ngày sang dấu thời gian không?

Những gì tôi không muốn làm

tôi có thể sử dụng cập nhật và thiết lập nó như ID nhưng điều đó không cảm thấy đúng, bởi vì hai mục có thể có cùng ngày và sau đó nó sẽ không phải là duy nhất.

+0

Hãy xem câu trả lời đầu tiên trong bài viết này: [link] (http://stackoverflow.com/questions/597863/how-to-sort-a-date-array-in-php) – Sander

Trả lời

65

Bạn không cần phải chuyển đổi ngày của bạn để dấu thời gian trước khi phân loại, nhưng đó là một ý tưởng tốt mặc dù bởi vì nó sẽ mất nhiều thời gian để sắp xếp mà không có nó.

$data = array(
    array(
     "title" => "Another title", 
     "date" => "Fri, 17 Jun 2011 08:55:57 +0200" 
    ), 
    array(
     "title" => "My title", 
     "date" => "Mon, 16 Jun 2010 06:55:57 +0200" 
    ) 
); 

function sortFunction($a, $b) { 
    return strtotime($a["date"]) - strtotime($b["date"]); 
} 
usort($data, "sortFunction"); 
var_dump($data); 
+0

Rất trực tiếp, câu trả lời sạch . Cảm ơn bạn. – Kray

+0

Câu trả lời rõ ràng nhưng điều này sẽ mất giá trị nếu hai ngày bằng nhau –

+0

Điều đó không đúng, tại sao phải không? Họ sẽ chỉ đơn giản là ngay sau mỗi khác. –

26

Sử dụng usort:

usort($array, function($a1, $a2) { 
    $v1 = strtotime($a1['date']); 
    $v2 = strtotime($a2['date']); 
    return $v1 - $v2; // $v2 - $v1 to reverse direction 
}); 
+0

Còn phiên bản này thì sao? 'usort ($ sortArray, function ($ a, $ b) { trở strcmp ($ a [ 'article_created_date'], $ b [ 'article_created_date']); }); ' – DrMed

16

Tôi khuyên bạn nên sử dụng đối tượng DateTime thay vì chuỗi, bởi vì bạn không thể dễ dàng so sánh chuỗi, cần thiết để sắp xếp. Bạn cũng nhận được thêm lợi thế để làm việc với ngày tháng.

Một khi bạn có các đối tượng DateTime, phân loại là khá dễ dàng:

usort($array, function($a, $b) { 
    return ($a['date'] < $b['date']) ? -1 : 1; 
}); 
-2

Ông đang cân nhắc có ngày như một chìa khóa, nhưng lo ngại rằng giá trị này sẽ được viết một ở trên kia, tất cả tôi muốn hiển thị (có lẽ không rõ ràng, đó là lý do tại sao tôi chỉnh sửa) là anh ta vẫn có thể có giá trị nguyên vẹn, không được viết ở trên khác, không phải thế này sao ?!

<?php 
$data['may_1_2002']= 
Array(
'title_id_32'=>'Good morning', 
'title_id_21'=>'Blue sky', 
'title_id_3'=>'Summer', 
'date'=>'1 May 2002' 
); 

$data['may_2_2002']= 
Array(
'title_id_34'=>'Leaves', 
'title_id_20'=>'Old times', 
    'date'=>'2 May 2002 ' 
); 


echo '<pre>'; 
print_r($data); 
?> 
Các vấn đề liên quan