2015-09-11 4 views
4

Я создаю функцию «Pinned» для своего форума, и я ищу способ разместить мои закрепленные темы в начале массива, чтобы они «застряли» в верхней части страницы.Сортировка массива по значению

Если тема не закреплена, то topic_pinned=NULL, если она прикреплена, то topic_pinned=0.

Массив сортируется по topic_updated. Приведенные темы должны быть отсортированы по topic_updated, оставаясь в верхней части страницы, а затем под приковавшимися темами являются неотъемлемыми темами, которые также сортируются по topic_updated.

Тема Array ($forum_topic_results):

Array 
(
    [0] => Array 
     (
      [topic_id] => 4 
      [topic_subject] => Test Subject #4 
      [topic_date] => 2015-09-10 18:34:18 
      [topic_by] => 1 
      [topic_pinned] => 
      [topic_updated] => 2015-09-10 20:37:22 
     ) 

    [1] => Array 
     (
      [topic_id] => 3 
      [topic_subject] => Test Subject #3 
      [topic_date] => 2015-08-22 09:24:40 
      [topic_by] => 1 
      [topic_pinned] => 0 
      [topic_updated] => 2015-09-04 22:02:31 
     ) 

    [2] => Array 
     (
      [topic_id] => 2 
      [topic_subject] => Test Subject #2 
      [topic_date] => 2015-08-15 10:56:00 
      [topic_by] => 1 
      [topic_pinned] => 
      [topic_updated] => 2015-09-04 19:45:32 
     ) 

    [3] => Array 
     (
      [topic_id] => 1 
      [topic_subject] => Test Subject #1 
      [topic_date] => 2015-08-30 19:48:17 
      [topic_by] => 1 
      [topic_pinned] => 0 
      [topic_updated] => 2015-09-03 00:44:38 
     ) 
) 

PHP:

/** 
* getAllTopics 
* 
* Retreives the topics of the chosen category from the `forum_topics` table. 
* 
* @param $cat_id 
* @access public 
*/ 
public function getAllTopics($cat_id=NULL) 
{ 
    $database=$this->database; 

    $database->query('SELECT topic_id, topic_subject, topic_date, topic_by, topic_pinned, topic_locked FROM forum_topics WHERE topic_cat = :catid ORDER BY topic_updated DESC', array(':catid' => $cat_id)); 
    $result = $database->statement->fetchAll(PDO::FETCH_ASSOC); 

    return $result; 
} 

# Get topics 
$forum_topic_results = $this->getAllTopics($_GET['cat']); 
foreach($forum_topic_results as $forum_topic_row) 
{ 
    # Get user's username. 
    $topic_by=SearchUser($forum_topic_row['topic_by']); 

    $data.='<tr>'. 
     '<td>'. 
      '<h3><a href="'.$_SERVER['PHP_SELF'].'?action=forum_posts&topic='.$forum_topic_row['topic_id'].'">'.$forum_topic_row['topic_subject'].'</a></h3>'. 
      'by '.$topic_by['username'].' on '.date('D M d, Y g:i a', strtotime($forum_topic_row['topic_date'])). 
     '</td>'. 
    '</tr>'; 
} 

Результат Я хочу:

Array 
(
    [0] => Array 
     (
      [topic_id] => 3 
      [topic_subject] => Test Subject #3 
      [topic_date] => 2015-08-22 09:24:40 
      [topic_by] => 1 
      [topic_pinned] => 0 
      [topic_updated] => 2015-09-04 22:02:31 
     ) 

    [1] => Array 
     (
      [topic_id] => 1 
      [topic_subject] => Test Subject #1 
      [topic_date] => 2015-08-30 19:48:17 
      [topic_by] => 1 
      [topic_pinned] => 0 
      [topic_updated] => 2015-09-03 00:44:38 
     ) 

    [2] => Array 
     (
      [topic_id] => 4 
      [topic_subject] => Test Subject #4 
      [topic_date] => 2015-09-10 18:34:18 
      [topic_by] => 1 
      [topic_pinned] => 
      [topic_updated] => 2015-09-10 20:37:22 
     ) 

    [3] => Array 
     (
      [topic_id] => 2 
      [topic_subject] => Test Subject #2 
      [topic_date] => 2015-08-15 10:56:00 
      [topic_by] => 1 
      [topic_pinned] => 
      [topic_updated] => 2015-09-04 19:45:32 
     ) 
) 
+2

Что вы хотите и что ожидаемый результат? И что вы пробовали? пожалуйста, вставьте свой код усилие также. THANKS. –

+0

Вы хотите отсортировать массив в соответствии с 'topic_updated'? –

+1

Возможный дубликат [Ссылка: все основные способы сортировки массивов и данных в PHP] (http://stackoverflow.com/questions/17364127/reference-all-basic-ways-to-sort-arrays-and-data-in -php) –

ответ

4

ли antother путь.

Mark в таблице базы данных PINNED как 1.

НЕ PINNED как 0.

После этого просто добавьте (заменить ORDER BY) на запрос, где и выбрать темы:

ORDER BY `topic_pinned` DESC, `topic_updated` DESC 
+0

Не учитывается дата! –

+0

действительно? Дело в том, чтобы оставаться в центре внимания. u читать только о том, как сортировать массив. но я представил решение, как избежать этого (с ОДНОЙ строкой кода), передав логику в sql. – M0rtiis

+0

Нет его смысла в том, что вам понадобится хотя бы ORDER BY topic_pinned, topic_updated – gview

0

Это должно работать:

<?php 
$finalArr = $forum_topic_results; 
foreach ($finalArr as $key => $row) { 
    $topic_pinned[$key] = $row['topic_pinned']; 
} 
array_multisort($topic_pinned, SORT_DESC, $finalArr); 
return $finalArr; 
?> 

больше информации об array_multisort: array_multisort

+0

Я не знал о 'array_multisort()', спасибо. – Draven

+0

Кажется, мне не хватает сравнения topic_updated. Если данные предварительно должны быть отсортированы по дате, это, вероятно, все равно. – gview

+0

@gview да .. это тоже должно работать .. но если возможно, то мы должны использовать только запрос .. –

1

Только для полноты, если вы на самом деле все еще хотели или должны были сделать это с помощью массивов через php, я бы предпочел использовать usort. Он не требует изготовления столбчатых массивов.

usort позволяет вам писать либо функцию, либо предоставлять анонимную функцию, которая выполняет логику сравнения. Поскольку у вас есть массив массивов, а также сравнение должно быть сделано с использованием нескольких элементов массива, вы могли бы легко написать простую функцию сравнения так долго, как вы помните, что:

Функция сравнения должна возвращать целое число меньше, чем, или больше нуля, если первый аргумент считается , соответственно меньшим, равным или большим, чем второй.

Что-то вроде этого (экспромтом, непроверенный код)

function cmp($a, $b) { 
    if ($a['topic_pinned'] == $b['topic_pinned']) { 
     // Have to compare Dates 
     $adate = new DateTime($a['topic_updated']); 
     $bdate = new DateTime($b['topic_updated']); 
     return ($adate < $bdate) ? -1 : 1; 
    } elseif ($a['topic_pinned'] == null) { 
     return 1; 
    } else { 
     return -1; 
    } 
} 

usort($array, 'cmp'); 

Как вы можете видеть, это становится сложнее быстро, из-за необходимости преобразования строки даты-времени в объекты даты и времени, так что вы можете на самом деле делать сравнения.

Тем более, почему использование базы данных sql лучше или быстрее/проще в этом случае.

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