【问题标题】:Sorting an array of weekdays time combination in PHP在 PHP 中对一组工作日时间组合进行排序
【发布时间】:2014-05-23 06:23:08
【问题描述】:

我有一个数组形式:

    $sortme = array(
        'Monday 10:00',
        'Friday 12:00',
        'Tuesday 14:00',
        'Monday 08:00',
        'Wednesday 11:00',
    );

元素的数量是未知的(所以我不能使用带有参考数组的 uksort 方法来获取工作日顺序as Mark suggested here)。我希望结果按时间顺序排序,并且总是从星期一开始,如下所示:

    $sorted = array(
        'Monday 08:00',
        'Monday 10:00',
        'Tuesday 14:00',
        'Wednesday 11:00',
        'Friday 12:00',
    );

有没有一种优雅的方法可以做到这一点,而无需将数组转换为二维数组并进行迭代?到目前为止,这将是我唯一的想法。

【问题讨论】:

  • 困难的部分是告诉 PHP 它们是同一周的所有日子。您没有关于那些日子的上下文,因此 PHP 将使用 next 可用的日子。所以排序这只会在周末工作。 codepad.viper-7.com/vBBeFt。但是这段代码可以修改得更智能。希望对您有所帮助。
  • “优雅”是什么意思。我不认为 1 线是可行的,但 10 线功能会起作用。
  • Michael,也许“最佳实践方法”比优雅更合适。
  • @MichaelVilleneuve:接受挑战(1 班轮)。

标签: php arrays sorting


【解决方案1】:

您可以在 PHP 中使用usort 函数,该函数将使用用户指定的比较函数进行排序。下面的代码可能不是最有效的,但它会产生正确的结果。

$sortme = array(
        'Monday 10:00',
        'Friday 12:00',
        'Tuesday 14:00',
        'Monday 08:00',
        'Wednesday 11:00',
    );

usort($sortme, function($a, $b) { return strcmp(date('N H:i', strtotime($a)), date('N H:i', strtotime($b))); });
print_r($sortme);

【讨论】:

  • 确实,效果很好。感谢您的快速回复。除非有更有效的解决方案,否则我会将其标记为正确答案。无论如何,远远好于我最初的想法,即拆分日期和时间并进行排序:-)
  • @Stephan 没问题。您可能会在 cmp 函数中找到一些优化 - 但总体思路是相同的 - 定义比较函数并使用它调用 usort
  • 为什么$days数组当日期可以给你同样的东西?
  • @Stephan 我修改了我的答案 - 把它变成一个非常简单的单线
【解决方案2】:

我正在尝试使用 array_multisortarray_mapcall_user_func_array 的单线,但我的大脑被炸了。试试这个:

foreach($sortme as $val) {
    $sorter[] = date('N H:i', strtotime($val));
}
array_multisort($sorter, SORT_ASC, $sortme);

编辑:一长班:

array_multisort(array_map(function($v){return date('N H:i',strtotime($v));}, $sortme), SORT_ASC, $sortme);

DEMO

array_multisort(
                array_map(
                          function($v){
                              return date('N H:i',strtotime($v));
                          }, 
                            $sortme),
                                     SORT_ASC, $sortme);

【讨论】:

  • 相当令人印象深刻,但为了代码的可维护性,我想我现在坚持使用多行代码;-)
【解决方案3】:
$sortme = array(
    'Monday 10:00',
    'Friday 12:00',
    'Tuesday 14:00',
    'Monday 08:00',
    'Wednesday 11:00',
);

$sorted = array();

// Add the day of week in the begining of the string
for($i = 0; $i < count($sortme); $i++){

    $day = explode(' ', $sortme[$i]);
    @$dayNumber = date('w', strtotime($day[0]));        

    array_push($sorted, $dayNumber . $day[0] . ' '. $day[1]);   

}

// Sort the array
asort($sorted);

// Remove the day of week
for($i = 0; $i < count($sorted); $i++){
    $sorted[$i] = substr($sorted[$i], 1);
}

var_dump($sorted);

【讨论】:

    【解决方案4】:

    您只需要将数组项转换为可排序的内容:

    function sortTimes(array $dates) {
        $base = strtotime('next monday 00:00');
        usort($dates, function($a, $b) use ($base) {
            return strtotime($a, $base) - strtotime($b, $base);
        });
        return $dates;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-31
      • 2014-03-10
      相关资源
      最近更新 更多