如何在php中使用mysql查询中的多维数组?

时间:2018-02-20 19:36:52

标签: php mysql json codeigniter multidimensional-array

我在mysql中使用三个表和一个查询来检索特定用户。

我从查询中得到了我想要的内容,但它没有以正确的方式格式化。

我的查询:

 public function get_all_payslips()
                {
                    $empid = $this->session->userdata('EMPLOYEE_ID');
                    $orgid = $this->session->userdata('CURRENT_ORG_ID');                    
                    $where = "EMPLOYEE_ID ='".$empid."' ";
                    $response = array();
                    $queryString = "SELECT
                                    em.EMPLOYEE_ID,
                                    em.EMPLOYEE_NAME
                                    FROM                                   
                                    uk_new_salary_slip assd,
                                    employee_master em
                                    WHERE
                                    em.".$where."
                                    GROUP BY em.EMPLOYEE_ID
                                    order by em.EMPLOYEE_NAME asc";                            
                    $query = $this->db->query($queryString);

                    foreach ($query->result() as $data) 
                    {         
                        $result = array();
                        $result['EMPLOYEE_NAME'] = $data-> EMPLOYEE_NAME;
                        $queryString = "SELECT
                                    mo.months,
                                    MONTH((assd.pay_period)) as monthss,
                                    YEAR((assd.pay_period)) as PAY_YEAR,
                                    GROUP_CONCAT(DISTINCT(assd.id)) as action,
                                    GROUP_CONCAT(DISTINCT(assd.ORG_ID)) as org
                                    FROM                         
                                    uk_new_salary_slip assd,
                                    employee_master em,                               
                                    months mo
                                    WHERE
                                    assd.emp_id =  ". $data->EMPLOYEE_ID ."
                                      AND mo.id =  MONTH((assd.pay_period))
                                      GROUP BY monthss,PAY_YEAR
                                      order by PAY_YEAR desc";
                        $queryString1 = "SELECT
                                    mo.months,
                                    MONTH((germany.pay_from)) as monthss,
                                    YEAR((germany.pay_from)) as PAY_YEAR,
                                    GROUP_CONCAT(DISTINCT(germany.id)) as action,
                                    GROUP_CONCAT(DISTINCT(germany.ORG_ID)) as org
                                    FROM                         
                                    new_germany_salary_slip germany,
                                    employee_master em,                               
                                    months mo
                                    WHERE
                                    germany.emp_id =  ". $data->EMPLOYEE_ID ."
                                      AND mo.id =  MONTH((germany.pay_from))
                                      GROUP BY monthss,PAY_YEAR
                                      order by PAY_YEAR desc";
                        $queryString2 = "SELECT
                                    mo.months,
                                    MONTH((poland.pay_from)) as monthss,
                                    YEAR((poland.pay_from)) as PAY_YEAR,
                                    GROUP_CONCAT(DISTINCT(poland.id)) as action,
                                    GROUP_CONCAT(DISTINCT(poland.ORG_ID)) as org
                                    FROM                         
                                    new_poland_salary_slip poland,
                                    employee_master em,                               
                                    months mo
                                    WHERE
                                    poland.emp_id =  ". $data->EMPLOYEE_ID ."
                                      AND mo.id =  MONTH((poland.pay_from))
                                      GROUP BY monthss,PAY_YEAR
                                      order by PAY_YEAR desc";

                        $query1 = $this->db->query($queryString);                       
                        $query2 = $this->db->query($queryString1);
                        $query3 = $this->db->query($queryString2);                  


                        $children = array();
                        foreach ($query1->result() as $data1)
                            {
                                $yearArray = array();                          
                                $yearArray['month'] = $data1->months;
                                $yearArray['year'] = $data1->PAY_YEAR;
                                $yearArray['org'] = $data1->org;                            
                                $yearArray['action'] = $data1->action;
                                array_push($children, $yearArray);
                            }
                        foreach ($query2->result() as $data2)
                            {
                                $yearArray = array();                          
                                $yearArray['month'] = $data2->months;
                                $yearArray['year'] = $data2->PAY_YEAR;
                                $yearArray['org'] = $data2->org;                            
                                $yearArray['action'] = $data2->action;
                                array_push($children, $yearArray);
                            }
                        foreach ($query3->result() as $data3)
                            {
                                $yearArray = array();                          
                                $yearArray['month'] = $data3->months;
                                $yearArray['year'] = $data3->PAY_YEAR;
                                $yearArray['org'] = $data3->org;                            
                                $yearArray['action'] = $data3->action;
                                array_push($children, $yearArray);
                            }
                            $result['children'] = $children;
                            array_push($response, $result);

                    }                   
                    return $response;                   
                }

如果在month数组中year相同,则IN action值应为4,2。如果您在对象中看到第0个月和第4个月且年份相同,则对象的action值应该在一行中,同样地,其org值应分别为org:40,47

{month:"FEBRUARY", year:"2018",org:"40,47",action:"4,2"}

我想要将数据格式化为这样,但在我的情况下,它会为每个操作显示不同的行。

enter image description here

1 个答案:

答案 0 :(得分:0)

数组推送只是将元素添加到数组的末尾。这不是你想要的。您希望基本上复合相同年份和月份的元素。为此,我们可以将其指定为第一个子数组键,只需将数组值附加到orgaction

    $output = array();
    foreach ($query1->result() as $data1) {
        $key = $data1->PAY_YEAR . $data1->months;
        if (!isset($output[$key]['month'])) {
            $output[$key]['month'] = $data1->months;
            $output[$key]['year'] = $data1->PAY_YEAR;
        }
        $output[$key]['org'][] = $data1->org;
        $output[$key]['action'][] = $data1->action;
    }
    foreach ($query2->result() as $data2) {
        $key = $data2->PAY_YEAR . $data2->months;
        if (!isset($output[$key]['month'])) {
            $output[$key]['month'] = $data2->months;
            $output[$key]['year'] = $data2->PAY_YEAR;
        }
        $output[$key]['org'][] = $data2->org;
        $output[$key]['action'][] = $data2->action;
    }
    foreach ($query3->result() as $data3) {
        $key = $data3->PAY_YEAR . $data3->months;
        if (!isset($output[$key]['month'])) {
            $output[$key]['month'] = $data3->months;
            $output[$key]['year'] = $data3->PAY_YEAR;
        }
        $output[$key]['org'][] = $data3->org;
        $output[$key]['action'][] = $data3->action;
    }
    echo '<pre>';
    print_r(array_keys($output));