PHP сгруппировал данные по датам и поместил их в массив - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть эти данные из моей базы данных, это для этого студента

Выход:

Array
(
    [0] => stdClass Object
        (
            [id] => 18
            [student_id] => 97
            [date] => 2018-08-31
            [type] => Intersexual Dormitory Visit
            [amount] => 0
            [count] => 3
            [remark] => 
            [reg_date] => 2018-09-04 16:50:16
        )

    [1] => stdClass Object
        (
            [id] => 17
            [student_id] => 97
            [date] => 2018-09-04
            [type] => Bringing or Drinking alcohol
            [amount] => 0
            [count] => 1
            [remark] => 
            [reg_date] => 2018-09-04 16:48:54
        )

    [2] => stdClass Object
        (
            [id] => 16
            [student_id] => 97
            [date] => 2018-09-04
            [type] => Throwing away wastes
            [amount] => 0
            [count] => 1
            [remark] => 
            [reg_date] => 2018-09-04 15:52:09
        )

    [3] => stdClass Object
        (
            [id] => 15
            [student_id] => 97
            [date] => 2018-09-04
            [type] => Class Late
            [amount] => 300
            [count] => 1
            [remark] => absent 1 class
            [reg_date] => 2018-09-04 15:46:19
        )

)

То, что я хотел сделать, это сгруппировать их, зависит от date (Year and Month), и когда amount равно 0, оно считается как warning, а когда больше 0, считается как penalty.

Это моя попытка:

public function getChart($in_data)
{
    $this->load->model('student_model');

    $student_info = $this->student_model->selectItem($in_data);

    $count_warning = 0;
    $count_penalty = 0;

    $chart = array();
    $items = parent::getItems(array('student_id'=>$student_info->member_id)); //this is for getting the Output

    foreach ($items as $item) {

        $count = array('penalty'=>0, 'warning'=>0);

        if ($item->amount > 0) {
            $count['penalty'] += $item->count;
        } else {
            $count['warning'] += $item->count;
        }

        $chart[date('Y-m', strtotime($item->date))] = $count;
    }

    return $chart;
}

Но это выглядело так:

Array
(
    [2018-08] => Array
        (
            [penalty] => 0
            [warning] => 3
        )

    [2018-09] => Array
        (
            [penalty] => 1
            [warning] => 0
        )

)

Дело в том, что у него есть только 3 предупреждения в августе и 2 предупреждения и 1 штраф за сентябрь, это был бы мой желаемый результат, как мне это сделать?

1 Ответ

0 голосов
/ 05 сентября 2018

Вот, пожалуйста (не проверено):

foreach ($items as $item) {
      //just because I can (use array key for ease of accessing it)
      $key = preg_replace('/-\d{2}$/', '', $item['date']);
      //you can use this instead if you want.
      //$key = date('Y-m', strtotime($item->date));

       //we can join our ifs tougher as the deal with the same elements
       //and this will make the code more efficient
      if(!isset($chart[$key])){
         //add $key as month
         $chart[$key] = array('penalty'=>0, 'warning'=>0, 'month'=>$key);         
      }else if ($item->amount > 0) {
         $chart[$key]['penalty'] += $item->count;
      } else {
         $chart[$key]['warning'] += $item->count;
      }

}

 //may want to put the proper content type
 //this tells the ajax call what it is and will parse it 
 //automatically in most browsers, so you can toss that JSON.parse().
 //CAUTION:do not output data before a header call
 //header('Content-type: application/json'); 

 //array_values removes the date key, its easier to built array with it.
 //then we just output the json
 echo json_encode(array_values($chart));

Тест регулярных выражений

Regex

  • - соответствует - буквально
  • \d соответствует любой цифре
  • {2} ровно 2 раза
  • $ соответствует концу строки.

Короче говоря, он заменяет деталь 2018-08 -31. Используйте функцию даты, если вы уверены, что она всегда будет действительной датой. Вы можете использовать регулярное выражение, если это не так или вы не хотите использовать дату ...

В качестве примечания я бы проверил, если бы вы использовали var_export вместо print_r для вывода данных, потому что мне лень форматировать их. На днях я напишу что-нибудь, чтобы преобразовать это для меня.

В качестве примечания второй стороны я добавил заголовок (в комментариях), если ваши данные неправильно анализируются обратным вызовом ajax, то вы можете использовать его, и он должен получиться как объект, как и предполагалось. Тем не менее, некоторые старые браузеры могут иметь проблемы с этим, такие как IE8, может быть, IE9 тоже и т. Д. Поскольку они не понимают это, они могут попытаться загрузить файл JSON. Так что это зависит от того, планируете ли вы их поддерживать.

Приветствие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...