2015-10-04 3 views
-1

У меня есть многомерный массив, который нуждается в сортировке. Массив что-то вроде этого:PHP usort эквивалент MySQL

$array[0] = $key1[0]['date']$key2['title'] 
$array[1] = $key1[0]['date']$key2['title'] 
$array[2] = $key2['title'] 

Каждый элемент массива может иметь несколько дат ($ key1 [0] [ 'дата'], $ key1 [1] [ 'дата'], и т.д.) или вообще , Когда присутствует, дата выглядит примерно так: 2015-10-04T00: 00.

откладывает StrToTime ($ key1 [0] [ 'дата']) и key2 [ 'названия'] каждый элемент массива в таблице тузда, а затем заказать его, как так:

(CASE WHEN date < UNIX_TIMESTAMP(CURDATE()) THEN 0 ELSE 1 END) DESC, date ASC 

мне нужен для тиражирования результатов непосредственно в массиве, возможно, используя usort(); $ key1 [0] ['date'] - это ключ для сортировки, который может не существовать.

Правило должно состоять в том, что если дата будет в будущем, она должна упорядочить ее по возрастанию (ближайшая из них первая), и если дата в прошлом, она должна упорядочить ее по убыванию. Если нет даты вообще, она должна помещать такие записи посередине (между будущим и настоящим).

Например, если сегодня 2015-10-04, он должен сортировать:

  1. 2015-10-05
  2. 2015-10-10
  3. 2015-12-01
  4. дата не установлена ​​
  5. дата не установлена ​​
  6. 2015-10-03
  7. 2015-09-01

Спасибо.

+1

этот рейз исключением '$ массив [0] = $ key1 [0] [ 'дата'] $ key2 [» title '] ' –

+0

Итак, правильный код для массива должен быть $ key1 [0] [' date '] [$ key2] [' title ']. Но давайте вернем спрос. Вы хотите, чтобы иметь возможность сортировать по key2? – user2420647

+0

Спасибо, что указали это. Мне нужно включить сортировку по ключевому слову1 [0] (сортировать по дате по возрастанию для будущих дат, по убыванию для прошлых дат и записей без даты, которые должны быть между ними). – Marius

ответ

0

У меня есть решение. Это может быть не лучшее решение, но оно работает так, как ожидалось.

<?php 

# The array of dates 
$dates = array('2015-10-05', '2015-10-10', '2015-12-01', '2015-10-03', '2015-09-01', 'invalid date', ''); 

# I shuffle the array as it will be in disorder - you want to remove this line 
shuffle($dates); 

# I save the todays timestamp into a variable 
echo '<pre>'; print_r($dates) ; echo '</pre>'; 
$now = time(); 
$today = strtotime(date('Y-m-d'), $now); 
echo 'Today is: ' . date('Y-m-d', $now) . '<br>'; 

# Define the buffers 
$before = array(); 
$undef = array(); 
$after = array(); 

# Loop through all dates 
foreach ($dates as $i => $date): 
    # Get the timestamp for the date X 
    $time = strtotime($date); 

    # Check if timestamp lies before or after today or is undefined 
    if ($time === false || $time === -1): 
    $undef[] = $date; 
    elseif ($time <= $today): 
    $before[] = $date; 
    else: 
    $after[] = $date; 
    endif; 
endforeach; 

# Sort both arrays by value (descending per default) 
sort($before); 
sort($after); 

# Here we make the dates that lie before today ascending 
$before = array_reverse($before); 

# Some output - you can ommit these lines 
$sorted = array('after' => $after, 'undefined' => $undef, 'before' => $before); 
echo '<pre>'; print_r($sorted); echo '</pre>'; 

# This will merge all three arrays together - this is the final result 
$result = array_merge($after, $undef, $before); 
echo '<pre>'; print_r($result); echo '</pre>'; 

Выход:

Array 
(
    [0] => invalid date 
    [1] => 
    [2] => 2015-10-03 
    [3] => 2015-10-10 
    [4] => 2015-12-01 
    [5] => 2015-09-01 
    [6] => 2015-10-05 
) 

Today is: 2015-10-04 

Array 
(
    [after] => Array 
     (
      [0] => 2015-10-05 
      [1] => 2015-10-10 
      [2] => 2015-12-01 
     ) 

    [undefined] => Array 
     (
      [0] => invalid date 
      [1] => 
     ) 

    [before] => Array 
     (
      [0] => 2015-10-03 
      [1] => 2015-09-01 
     ) 

) 

Array 
(
    [0] => 2015-10-05 
    [1] => 2015-10-10 
    [2] => 2015-12-01 
    [3] => invalid date 
    [4] => 
    [5] => 2015-10-03 
    [6] => 2015-09-01 
) 

Вы можете проверить его здесь: php tester tool