【问题标题】:Display the events for the current month first then the rest last desc首先显示当前月份的事件,然后显示其余的最后一个 desc
【发布时间】:2018-04-15 22:05:36
【问题描述】:

我有这个控制器,它按 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">&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);
    }
}

【问题讨论】:

  • 那么你基本上是想拿你的数组 - 撕掉当月的条目并在最后附加剩菜吗?
  • 请发布事件列表的预期结果。
  • @TimBrownlaw 不知道该怎么做?
  • 不确定“休息”是什么...因此,如果您有 8 月、9 月、10 月、11 月、12 月的活动并且当前月份是 11 月。剩下的你想做什么?什么是“休息”?只是 12 月,还是您还想要过去日期的事件?
  • 请显示您想要的视图输出(本月和“休息”),可能是模型图像或类似图像。谢谢

标签: php codeigniter


【解决方案1】:

uasort()

您不需要专门的年份和月份表列。在日期格式上使用原生 MySQL 和 PHP 函数,您可以实现几乎任何现实世界的示例算法。 以下是您应该采取的措施以避免不必要的或压倒性的 DB 调用。

我假设在这一行

$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 在处理数组方面表现出非常强大的实力,因此您应该考虑使用这些函数和类,然后再进行比实际需要更多的 DB 调用。

编辑:

这个结果更好:

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 并接受了答案,这对我来说是一个很好的答案
  • 谢谢。另外,检查this answer 并尝试如何从数据库中获取正确的订单。然后您可以测试每种方法使用的时间和资源,以明智地选择合适的方法。
【解决方案2】:

我猜你可以将$this-&gt;db-&gt;where('event_date &gt;=', date('Y-m-01')); 添加到你的getevents() 方法中。

【讨论】:

    【解决方案3】:

    尝试替换以下代码行:

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

    通过以下行:

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

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

    【讨论】:

    • @RickJames 因为它已经在控制器中声明了,请检查控制器代码是否有任何效果,我已经找到了另一种方法
    【解决方案4】:

    解决方案

    我认为只创建两个数组是更好的选择,然后将它们合并。我必须为单独的年份和月份创建另一列

    通过添加 where() 工作和 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);
    }
    

    【讨论】:

    • 从技术上讲,您不需要两个数组...您可以简单地将$data 声明为数组,并在您的两个foreach 循环中,附加到$data 变量。为您节省 array_merge 步骤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 2010-10-23
    • 1970-01-01
    • 2020-09-25
    相关资源
    最近更新 更多