按日期排序数组,然后按时间排序 - PHP

时间:2016-12-01 22:12:40

标签: php arrays sorting

我有一个预订系统,用于预订这种形式的阵列:

array(6) {
[0]=> array(5) {
      ["date"]=> string(10) "08/12/2016"
      ["start"]=> string(5) "15:00"
      ["end"]=> string(5) "16:00"
      ["booked_by"]=> string(5) "mark"
      ["id"]=> string(1) "4"
}

我使用此函数按日期对其进行排序,并将所有预订放入数组中:

    function getBooking($aula) {
    global $client;
    $keys = $client->keys("Calendar:aula$aula:*");
    $booking = array();

    foreach ($keys as $key => $value) {
        $result = $client->hGetAll($value);
        array_push($booking, $result);
    }

    usort($booking, function($a1, $a2) {
        $v1 = strtotime(str_replace("/", "-", $a1['data']));
        $v2 = strtotime(str_replace("/", "-", $a2['data']));
        return $v1 - $v2; // $v2 - $v1 to reverse direction
    });

    return $booking;
}

我还需要通过“开始”键对其进行排序,以便在日历中显示它们。我尝试添加另一个usort但它不起作用。如果您需要更多信息,请给我回信 在此先感谢您的帮助

2 个答案:

答案 0 :(得分:2)

正如@ Don's Panic所说,如果您可以将数据作为数据库请求的一部分进行排序。

否则,如果您按原样坚持使用数组 - 您可以从datestart字符串中提取数据,按正确顺序排列,然后在strcmp()时使用usort($booking, function($a, $b) { // extract year, month and day from date list($a_month, $a_day, $a_year) = explode('/', $a['date']); list($b_month, $b_day, $b_year) = explode('/', $b['date']); // compare the correctly ordered strings return strcmp($a_year.$a_month.$a_day.$a['start'], $b_year.$b_month.$b_day.$b['start']); }); 你排序。例如,

strcmp()

如果某些代码不熟悉,请参考 list() http://php.net/manual/en/function.strcmp.php
var Child = React.createClass({ render: function() { return( <tr> <td colSpan="8"> I am a child that can be hidden!</td> </tr> ) } }) var CreateRows = React.createClass({ getInitialState: function() { return {childVisible: true} }, render: function(){ var rows = this.props.people.map(function(row, i){ return ( <tr key={i} onClick={this.onClick}> <td>{row['id']}</td> </tr> { this.state.childVisible ? <Child /> : null } ) }) return ( <tbody> {rows} </tbody> ) }, onClick: function(){ this.setState({childVisible: !this.setstate.childVisible}) } }); http://php.net/manual/en/function.list.php

答案 1 :(得分:0)

@Steve解决方案很棒。但您也可以使用array_multisortarray_column

array_multisort(
    array_map('strtotime', array_column($booking, 'date')),
    array_column($booking, 'start'),
    $booking
);

这是working demo

虽然在这种特殊情况下它并不是最佳的,但在您需要时,例如,按date升序排序,但按start降序或其他方式排序可能更合适。

尽管如此,这些操作最好在数据库内完成。

修改

正如@ Don's Panic在评论中所说,由于格式的原因,按日期排序可能很棘手。为了弥补这一点,我们可以array_map 'date'strtotime