我有这个控制器,通过event_date显示我的事件,日期格式类似于' Y-m-d'
问题我是否可以先在列表中显示本月的事件,然后再显示其他事件?
模型
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">»</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);
}
}
答案 0 :(得分:1)
您不需要专门的年份和月份表格列。使用日期格式的本机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);
}