2015-03-30 2 views
0

Im работает над галереей glob, он показывает evens (показано как изображение) для каждого месяца. Это мой код, чтобы сделать это:Сортировка массива glob, начиная с текущего месяца

$folderGlob = glob("gallery/events/2015/*/"); 
foreach($folderGlob as $folder){ 
    $fileglob = glob($folder . "*.{jpg,png}", GLOB_BRACE); 
    foreach($fileGlob as $file){ 
     // lets say i dont have images, but i just echo $file 
     echo $file; 
    } 
} 

выход будет выглядеть следующим образом:

gallery/events/2015/01/01.jpg 
gallery/events/2015/02/04.jpg 
gallery/events/2015/03/09.jpg 
gallery/events/2015/04/21.jpg 
gallery/events/2015/05/04.jpg 
gallery/events/2015/06/09.jpg 
gallery/events/2015/07/21.jpg 
... etc 

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

вот пример того, что я хочу:

gallery/events/2015/03/09.jpg //current month 
gallery/events/2015/04/21.jpg 
gallery/events/2015/05/04.jpg 
gallery/events/2015/06/09.jpg 
gallery/events/2015/07/21.jpg 
... 
gallery/events/2015/12/02.jpg //lastmonth 
gallery/events/2015/01/01.jpg 
gallery/events/2015/02/04.jpg 

какие-либо советы или трюки?

EDIT: я теперь использовать это:

$currentMonth = date("m"); 
$month = intval($currentMonth); 

foreach ($folderGlob as $folder) { 
    $folderMonth = intval(basename($folder)); 
    if($folderMonth < $month){ 
     continue; 
    } else { 
     print $folderMonth . '<br>'; 
    } 
} 

foreach ($folderGlob as $folder) { 
    $folderMonth = intval(basename($folder)); 
    if($folderMonth >= $month){ 
     continue; 
    } else { 
     print $folderMonth . '<br>'; 
    } 
} 

выход:

gallery/2015/03/ 
gallery/2015/04/ 
gallery/2015/05/ 
gallery/2015/06/ 
gallery/2015/07/ 
gallery/2015/08/ 
gallery/2015/09/ 
gallery/2015/10/ 
gallery/2015/11/ 
gallery/2015/12/ 
gallery/2015/01/ 
gallery/2015/02/ 
+0

Либо вам нужно будет помещать файлы в массив, а затем сортировать их перед отображением; или поставить пару тестов, чтобы сначала проверить файл текущей даты, а затем подавить текущую дату с тегом if в вашем цикле –

+0

, а glob - это массив, и я знаю, как пропустить с помощью оператора if, но позволяет сказать я пропустил все один раз перед текущим месяцем, мне все еще нужно их показать после того, как цикл завершил последний месяц –

ответ

-1

Используйте пользовательскую функцию сортировки:

$array = array('gallery/events/2015/01/01.jpg', 
'gallery/events/2015/02/04.jpg', 
'gallery/events/2015/05/04.jpg', 
'gallery/events/2015/04/21.jpg', 
'gallery/events/2015/06/09.jpg', 
'gallery/events/2015/03/09.jpg', 
'gallery/events/2015/07/21.jpg'); 

usort($array, function($a, $b) { 

    $currentmonth = date('n'); 
    preg_match('#^gallery/events/(\d+)/(\d+)/(\d+)\.jpg$#', $a, $matchesa); 
    preg_match('#^gallery/events/(\d+)/(\d+)/(\d+)\.jpg$#', $b, $matchesb); 

    $timea = mktime(0, 0, 0, $matchesa[2], $matchesa[3], $matchesa[1]); 
    $timeb = mktime(0, 0, 0, $matchesb[2], $matchesb[3], $matchesb[1]); 

    $montha = (int)$matchesa[2]; 
    $monthb = (int)$matchesb[2]; 



    if ( 
     ($montha > $currentmonth && $monthb > $currentmonth) || 
     ($montha < $currentmonth && $monthb < $currentmonth) || 
     ($montha == $currentmonth && $monthb == $currentmonth)) 
     { 
      if ($timea < $timeb) return -1; 
      else if ($timea > $timeb) return 1; 
      else return 0; 
     } 
     else 
     { 
      if ($montha < $currentmonth) return 1; 
      else if ($montha > $currentmonth) return -1; 
      else return 0; 
     } 
}); 


print_r($array); 

Here является рабочим испытанием.

+0

, который на самом деле не то, что я ищу, вы отсортировали массив с 01 по 07, но мой цикл делает это уже, мне нужно начинать с текущей даты, затем оттуда до 12 и после последнего месяца делать месяцы до текущей даты. –

+0

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

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