2015-10-04 144 views
-1

我有一個需要排序的多維數組。該陣列是這樣的:等價於MySQL的PHP​​ usort

$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] [ '日期']),並在MySQL表中的每個數組元素的KEY2 [ '標題'],然後訂購它像這樣:

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

我需要直接在數組中複製結果,可能使用usort(); $ key1 [0] ['date']是排序的關鍵,這可能不存在。

規則應該是,如果日期在將來,它應該命令它升序(最接近的是第一個),如果日期在過去,它應該命令它降序。如果沒有日期,它應該把這些條目放在中間(未來和現在之間)。

例如,如果今天是2015年10月4日,它應該排序:

  1. 2015年10月5日
  2. 2015年10月10日
  3. 2015年12月1日
  4. 無日期設置
  5. 沒有日期爲
  6. 2015年10月3日
  7. 2015年9月1日

謝謝。

+1

這引發異常'$數組[0] = $ key1的[0] [ '日期'] $ KEY2 [」 title']' –

+0

所以數組的正確代碼應該是$ key1 [0] ['date'] [$ key2] ['title']。但讓我們得到正確的需求。 你想啓用排序key2嗎? – user2420647

+0

謝謝你指出。我需要對key1 [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