首先显示当前月份的事件,然后显示其余的最后一次事件

时间:2017-11-03 08:22:53

标签: php codeigniter

我有这个控制器,通过event_date显示我的事件,日期格式类似于' Y-m-d'

  

问题我是否可以先在列表中显示本月的事件,然后再显示其他事件?

enter image description here

模型

public function getevents($filter = array()) {
    $this->db->limit($filter['limit'], $filter['start']);
    $this->db->order_by($filter['order'], $filter['sort']);
    $query = $this->db->get('event');
    return $query->result_array();
}

控制器

<?php

class Events extends Admin_Controller {

    private $error = array();

    public function __construct() {
        parent::__construct();
        $this->load->model('admin/event/events_model');
        $this->load->library("pagination");
    }

    public function index() {

        $this->getlist();
    }

    public function getlist() {

        $this->document->set_title('Events');

        $data['heading_title'] = 'Events';

        $data['breadcrumbs'] = array();

        $data['breadcrumbs'][] = array(
            'text' => 'Dashboard',
            'active' => '',
            'href' => site_url('admin/dashboard')
        );

        $data['breadcrumbs'][] = array(
            'text' => 'Events',
            'active' => 'active',
            'href' => site_url('admin/events')
        );

        if ($this->input->get('order')) {
            $order = $this->input->get('order'); 
        } else {
            $order = 'event_date';
        }

        if ($this->input->get('sort')) {
            $sort = $this->input->get('sort'); 
        } else {
            $sort = 'desc';
        }

        if ($this->input->get('limit')) {
            $limit = $this->input->get('limit'); 
        } else {
            $limit = 5;
        }

        if ($this->uri->segment(3)) {
            $page = $this->uri->segment(3); 
        } else {
            $page = 0;
        }

        $config["base_url"] = base_url('admin/events');
        $config["total_rows"] = $this->events_model->total_count();
        $config["per_page"] = $limit;
        $config["uri_segment"] = 3;
        $config['use_page_numbers'] = FALSE;

        $config['full_tag_open']    = '<nav><ul class="pagination">';
        $config['full_tag_close']   = '</ul></nav>';
        $config['num_tag_open']     = '<li class="page-item"><span class="page-link">';
        $config['num_tag_close']    = '</span></li>';
        $config['cur_tag_open']     = '<li class="page-item active"><span class="page-link">';
        $config['cur_tag_close']    = '<span class="sr-only">(current)</span></span></li>';
        $config['next_tag_open']    = '<li class="page-item"><span class="page-link">';
        $config['next_tagl_close']  = '<span aria-hidden="true">&raquo;</span></span></li>';
        $config['prev_tag_open']    = '<li class="page-item"><span class="page-link">';
        $config['prev_tagl_close']  = '</span></li>';
        $config['first_tag_open']   = '<li class="page-item"><span class="page-link">';
        $config['first_tagl_close'] = '</span></li>';
        $config['last_tag_open']    = '<li class="page-item"><span class="page-link">';
        $config['last_tagl_close']  = '</span></li>';

        $this->pagination->initialize($config);

        $filter = array(
            'order' => $order,
            'sort' => $sort,
            'limit' => $limit,
            'start' => $page 
        );

        $data['events'] = array();

        $events = $this->events_model->getevents($filter);
        foreach ($events as $event) {

            $button = array(
                'type' => 'button',
                'class' => 'btn btn-danger',
                'content' => '<i class="fa fa-trash" aria-hidden="true"></i> Remove',
                'data-toggle' => 'model',
                'data-target' => '#event_model',
                'data-id' => $event['event_id']
            );

            $data['events'][] = array(
                'event_title' => $event['event_title'],
                'event_date' => date('l dS F Y', strtotime($event['event_date'])),
                'href' => anchor('admin/events/update/' . $event['event_id'], 'Edit', array('class' => 'btn btn-primary')),
                'delete' => form_button($button)
            );
        }

        $data["pagination_links"] = $this->pagination->create_links();

        $data['header'] = Modules::run('admin/common/header/index');
        $data['column_left'] = Modules::run('admin/common/column_left/index');
        $data['footer'] = Modules::run('admin/common/footer/index');
        $data['topnavbar'] = Modules::run('admin/common/topnavbar/index');

        $this->load->view('template/event/getlist', $data);
    }
}

4 个答案:

答案 0 :(得分:1)

reference

您不需要专门的年份和月份表格列。使用日期格式的本机MySQL和PHP函数,您几乎可以实现任何真实的示例算法。 以下是为避免不必要或压倒性的数据库调用而应采取的措施。

我假设在这一行

$events = $this->events_model->getevents($filter);

你得到的$events可能是这样的

$events = [
    0 => [
        'event_id' => 1,
        'event_date' => '2017-11-16',
    ],
    1 => [
        'event_id' => 2,
        'event_date' => '2017-02-22',
    ],
    2 => [
        'event_id' => 3,
        'event_date' => '2017-12-14',
    ],
    3 => [
        'event_id' => 4,
        'event_date' => '2017-11-16',
    ],
    4 => [
        'event_id' => 5,
        'event_date' => '2017-03-01',
    ],
    5 => [
        'event_id' => 6,
        'event_date' => '2017-12-02',
    ],
];

我并不代表所有领域,但很少需要理解原则

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Welcome extends CI_Controller
{

    public function index()
    {
        $events = [
            0 => [
                'event_id' => 1,
                'event_date' => '2017-11-16',
            ],
            1 => [
                'event_id' => 2,
                'event_date' => '2017-02-22',
            ],
            2 => [
                'event_id' => 3,
                'event_date' => '2017-12-14',
            ],
            3 => [
                'event_id' => 4,
                'event_date' => '2017-11-16',
            ],
            4 => [
                'event_id' => 5,
                'event_date' => '2017-03-01',
            ],
            5 => [
                'event_id' => 6,
                'event_date' => '2017-12-02',
            ],
        ];

        var_dump($events);

        // looping through an array cursor is moving forward 
        // so useing uasort, latest elements will be sorted closer to beginning
        // inversing array before uasort, rest of array keeps 
        // the order that is returned from db
        $events = array_reverse($events, $bool = false);// check yourself if you need true flag here

        try {
            uasort($events, array('self', 'cmp'));
        } catch (\Exception $e) {
            echo $e->getMessage();
        }

        var_dump($events);
    }

    public static function cmp($a)
    {
        $am = date('m', strtotime($a['event_date']));

        if ($am == date('m')) {
            return -1;
        }

        return 1;
    }

}

这应该是如何通过在多维数组中使用子键对元素进行排序的方式,并且使用PHP进行数组操作比使用多个数据库调用更好。

此外,PHP在数组工作方面表现出非常强大的优势,因此在进行比实际需要更多的数据库调用之前,应考虑使用这些函数和类。

编辑:

用这个得到更好的结果:

var_dump($events);

$newArray = [];
foreach($events as $k => $v) {
    if (date('m', strtotime($v['event_date'])) == date('m')) {
        $newArray[] = $v;
        unset($events[$k]);
    }
}

var_dump(array_merge($newArray, $events));
exit;

答案 1 :(得分:0)

我猜您可以在$this->db->where('event_date >=', date('Y-m-01'));方法中添加getevents()

答案 2 :(得分:0)

尝试替换以下代码行:

    $this->db->order_by($filter['order'], $filter['sort']);

通过以下行:

    $this->db->order_by("event_date", "desc");

并检查您的event_date格式是否正常。

答案 3 :(得分:0)

解决方案

我认为只创建两个数组是更好的选择然后合并它们。我不得不为一年又一个月创建另一个专栏

通过添加where()working和or_where()然后使用array_merge

public function getevents($filter = array()) {

    $data1 = array();
    $data2 = array();

    $this->db->where('month =', date('m'));
    $this->db->order_by($filter['order'], $filter['sort']);
    $current_month_query = $this->db->get('event');

    foreach ($current_month_query->result_array() as $result1) {

        $data1[] = array(
            'event_title' => $result1['event_title'],
            'event_description' => $result1['event_description'],
            'event_date' => date('l dS F Y', strtotime($result1['event_date'])),
        );
    }

    $this->db->where('month >', date('m'));
    $this->db->or_where('month <', date('m'));
    $this->db->order_by($filter['order'], $filter['sort']);
    $other_query = $this->db->get('event');

    foreach ($other_query->result_array() as $result2) {

        $data2[] = array(
            'event_title' => $result2['event_title'],
            'event_description' => $result2['event_description'],
            'event_date' => date('l dS F Y', strtotime($result2['event_date'])),
        );
    }

    return array_merge($data1, $data2);
}