【问题标题】:Sort glob array starting from current month从当前月份开始对 glob 数组进行排序
【发布时间】:2015-03-30 07:59:15
【问题描述】:

我正在开发一个 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

你可以看到我的地图结构就像一个日期,文件名是天,地图名是月份。现在我需要对其进行排序,以便首先显示当前的 mont。

这里是我想要的例子:

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

任何提示或技巧?

编辑: 我现在用这个:

$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/

【问题讨论】:

  • 要么你需要将文件放在一个数组中,然后在显示之前对其进行排序;或先进行几个测试以检查当前日期文件,然后在循环中使用 if 测试来抑制当前日期
  • 好吧,glob 是一个数组,我知道如何使用 if 语句跳过,但是可以说我在本月之前跳过了所有一次,我仍然需要它们在循环完成最后一个后显示月

标签: php arrays sorting foreach glob


【解决方案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 是一个工作测试。

【讨论】:

  • 那不是我真正想要的,您从 01 到 07 对数组进行了排序,但我的循环已经这样做了,我需要从当前日期开始,然后从那里开始,直到 12 点和最后一个之后月做当前日期之前的几个月。
  • 你欠我一块饼干好先生,这不是一件容易的事。 (如果这对您有用,请确保将其标记为答案)。
猜你喜欢
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 2016-10-21
  • 2018-01-10
  • 1970-01-01
  • 2014-01-25
相关资源
最近更新 更多