2016-03-15 2 views
-1

Я пытаюсь отсортировать ассоциативный массив по посланной стоимости, которая является дата «% а,% е% б% Y% к:% я (% с)»Сортировка ассоциативного массива по дате значение

Array 
(
    [0] => Array 
     (
      [starName] => Natalie Peri 
      [posted] => Wed, 2 Mar 2016 15:05(09) PM Pacific/Auckland 
     ) 

    [1] => Array 
     (
      [starName] => Taylor Hay 
      [posted] => Wed, 2 Mar 2016 15:34(37) PM Pacific/Auckland 
     ) 

    [2] => Array 
     (
      [starName] => Amber Dawn Fox 
      [posted] => Tue, 5 Jan 2016 5:54(48) PM Pacific/Auckland 
     ) 

    [3] => Array 
     (
      [starName] => Young Artist Awards 2016 
      [posted] => Mon, 14 Mar 2016 11:12(20) PM Pacific/Auckland 
     ) 

) 

Так что это было бы Молодой, Натали, Тейлор, Янтарь. (Массив 1 = получает ключ 1 и 2 и массив 2 получает ключ 3 и 4 кстати)

Я попытался это:

 include("../database_connection.php"); 

$sth = "SELECT starName, date as posted 
FROM blog 
WHERE blog.approved =1 
ORDER BY STR_TO_DATE(posted, '%a, %e %b %Y %k:%i(%s)') DESC 
LIMIT 2"; 
$r = $dbc->query($sth); 
$results = array(); 

while($row = $r->fetch_assoc()) { 
    $results[] = $row; 
} 

$sth2 = "SELECT starName, posted FROM questions 
             INNER JOIN stars ON questions.starID = stars.starID 
             INNER JOIN roles ON stars.starID = roles.starID 
             LEFT JOIN users ON users.userID = questions.userID 
             WHERE returned =1 
             AND most =1 
             ORDER BY STR_TO_DATE(posted, '%a, %e %b %Y %k:%i(%s)') DESC, questionID 
             LIMIT 2"; 
$r2 = $dbc->query($sth2); 
$results2 = array(); 

while($row2 = $r2->fetch_assoc()) { 
    $results2[] = $row2; 
} 


$result = array_merge($results, $results2); 


function compareByDate($item1, $item2) { 
    return strtotime($item1['posted']) - strtotime($item2['posted']); 
} 
usort($result, 'compareByDate'); 


echo "<pre>"; 
print_r($result); 
echo "</pre>"; 

но Янтарный Рассвет Фокс всегда появляется первым, кто-нибудь знает, где я» м не так?

+0

преобразовать строку даты в метку времени UNIX или объект DateTime внутри пользовательской функции первого – Ghost

+0

@Ghost спасибо за ответ, как бы я идти об этом? например: 'function compareByDate ($ item1, $ item2) { $ item1 = date_format ($ item1 ['posted'], 'Y-m-d H: i: s'); $ item2 = date_format ($ item2 ['posted'], 'Y-m-d H: i: s'); return $ item1 - $ item2; } ' – jenstar

+0

Каков источник данных? –

ответ

2

Как я уже сказал в комментариях, сначала конвертируйте его в временную метку unix, либо сначала используйте объекты DateTime.

Я принимаю rsort - это только опечатка. Вы имеете в виду usort. И ($result, 'date_compare'); используйте имя пользователя: compareByDate. Он не соответствует:

Если вы столкнулись с маршрутом DateTime, просто используйте метод createFromFormat и укажите формат времени, который у вас есть.

D, j M Y G:i(s) 

Пример:

function compareByDate($item1, $item2) { 
    $a = DateTime::createFromFormat('D, j M Y G:i(s)', $item1['posted']); 
    $b = DateTime::createFromFormat('D, j M Y G:i(s)', $item2['posted']); 
    return $b->getTimeStamp() - $a->getTimeStamp(); 
} 
usort($result, 'compareByDate'); 

Это return $b->getTimeStamp() - $a->getTimeStamp();

(Ь - а) это возвращается в нисходящем FASHION

своп это (а - Ь), когда вам нужно он поднимается.

Sample Code

Sidenote: Если по какой-либо причине, вы хотите сохранить ключ отношения, просто использовать uasort.

Редактировать: По какой-либо причине вам требуется специальное форматирование времени для представления пользователю, а затем просто оставьте это неповрежденным из вашего запроса. Я думаю, что формат выглядит следующим образом:

SELECT DATE_FORMAT(`timestamp_column`, '%a, %e %b %Y %k:%i(%s)') AS `posted` 

Помните, просто добавьте сырой timestamp_columnYYYY-MM-DD HH: MM: SS по запросу столбцов, которые вы хотите включить.

SELECT DATE_FORMAT(`timestamp_column`, '%a, %e %b %Y %k:%i(%s)') AS `posted`, `timestamp_column` 

Тогда просто использовать strtotime:

function compareByDate($item1, $item2) { 
    return strtotime($item2['timestamp_column']) - $item1['timestamp_column']; 
} 
usort($result, 'compareByDate'); 
+0

Ничего не видно на странице, этот код, иначе нижний колонтитул или print_r(), имеет значение, если я ' м, используя ниже PHP 5.3? – jenstar

+0

@jenstar, что вы имеете в виду, ничего не появляется? вы имеете в виду в своей среде? я уже установил онлайн-демонстрацию, чтобы вы могли проверить – Ghost

+0

@jenstar. Да, это имеет значение, ['creaFromFormat'] (http://php.net/manual/en/datetime.createfromformat.php) требуется> = 5.3 – Ghost

Смежные вопросы