Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Codeigniter上解析并忽略多维数组中的空数据_Php_Arrays_Json_Codeigniter_Multidimensional Array - Fatal编程技术网

Php 在Codeigniter上解析并忽略多维数组中的空数据

Php 在Codeigniter上解析并忽略多维数组中的空数据,php,arrays,json,codeigniter,multidimensional-array,Php,Arrays,Json,Codeigniter,Multidimensional Array,我有多维数组,从print_rjson_encode$test显示;在我的控制器中,如下所示: [[],[],[],[],[],[],[],[],[],[],[{"Username":"arnab@tmail.com","Role":"Software Engineer","today":"139","weekly":"391","monthly":"1149","yearly":"1149"},{"Username":"dolly@fmail.com","Role":"DevOps","tod

我有多维数组,从print_rjson_encode$test显示;在我的控制器中,如下所示:

[[],[],[],[],[],[],[],[],[],[],[{"Username":"arnab@tmail.com","Role":"Software Engineer","today":"139","weekly":"391","monthly":"1149","yearly":"1149"},{"Username":"dolly@fmail.com","Role":"DevOps","today":"251","weekly":"405","monthly":"736","yearly":"736"}]]
我的代码是:

public function getUserAchievement(){
    $test = array();
    $res = array();
    $data = $this->queries_trend->getDataCustomer();
    foreach ($data as $key => $value) {
            array_push($test, $this->passing($value['Customer'], $value['Project']));
    }
    print_r(json_encode($test));
}

public function passing($customer, $project){
    $date = DATE("Y-m-d");
    $time = DATE("H:i:s");
    $query = $this->db->query("SELECT t_closed_by As Username, ixt_user_type.user_owner As Role,
                  COUNT( case when t_closed_time > curdate() - interval 1 day THEN 1 END ) as today,
                  COUNT( case when t_closed_time > curdate() - interval 7 day THEN 1 END ) as weekly,
                  COUNT( case when t_closed_time > curdate() - interval 1 month THEN 1 END ) as monthly,
                  COUNT( case when t_closed_time > curdate() - interval 1 year THEN 1 END ) as yearly
                FROM p_".$customer."_".$project."_ticket
                LEFT JOIN m_event_type ON p_".$customer."_".$project."_ticket.t_req_type = m_event_type.ev_type
                LEFT JOIN ixt_user_type ON m_event_type.ev_user_type_target = ixt_user_type.user_type
                WHERE t_status = 9
                GROUP BY t_closed_by; ")->result_array();
     return $query;
}
我的问题是,如果多维数组中存在条件空数组,如何过滤数据并转换成如下:

[[{"Username":"arnab@tmail.com","Role":"Software Engineer","today":"139","weekly":"391","monthly":"1149","yearly":"1149"}],[{"Username":"dolly@fmail.com","Role":"DevOps","today":"251","weekly":"405","monthly":"736","yearly":"736"}]]
需要帮助,谢谢各位…

试试这个:

<?php
$array = '[[],[],[],[],[],[],[],[],[],[],[{"Username":"arnab@tmail.com","Role":"Software Engineer","today":"139","weekly":"391","monthly":"1149","yearly":"1149"},{"Username":"dolly@fmail.com","Role":"DevOps","today":"251","weekly":"405","monthly":"736","yearly":"736"}]]';

$array = json_decode($array);

$newArray = [];
foreach($array as $a){
    if ($a) {
        array_push($newArray, $a);
    }
}
var_dump($newArray);
试试这个,我做了几行修改

使用array_filter$array删除所有空的元素/内部数组。 使用rest$array返回案例中的第一个arraysuitable。 使用json_encode$array以json格式返回数据

$array = json_decode('[[],[],[],[],[],[],[],[],[],[],[{"Username":"arnab@tmail.com","Role":"Software Engineer","today":"139","weekly":"391","monthly":"1149","yearly":"1149"},{"Username":"dolly@fmail.com","Role":"DevOps","today":"251","weekly":"405","monthly":"736","yearly":"736"}]]', true);
echo json_encode(array_values(array_filter($array)));

希望这有帮助。

将json解码为数组

使用数组过滤器删除空值

使用数组_值重新索引结果

最后重新编码为json

输出:

public function passing($customer, $project) {
return $this->db->query(
    "SELECT t_closed_by AS Username,
            iutypes.user_owner AS Role,
            COUNT(CASE WHEN t_closed_time > CURDATE() - INTERVAL 1 DAY THEN 1 END) AS today,
            COUNT(CASE WHEN t_closed_time > CURDATE() - INTERVAL 7 DAY THEN 1 END) AS weekly,
            COUNT(CASE WHEN t_closed_time > CURDATE() - INTERVAL 1 MONTH THEN 1 END) AS monthly,
            COUNT(CASE WHEN t_closed_time > CURDATE() - INTERVAL 1 YEAR THEN 1 END) AS yearly
    FROM p_".$customer."_".$project."_ticket AS tickets
    INNER JOIN m_event_type AS metypes ON tickets.t_req_type = metypes.ev_type
    INNER JOIN ixt_user_type AS iutypes ON metypes.ev_user_type_target = iutypes.user_type
    WHERE t_status = 9
    GROUP BY t_closed_by"
    )->result_array();
}
上面使用的array_filter然后array_值消除了空的子数组,然后为输出数组分配新的索引。reset不满足您的需要

一个最佳的解决方案是重新设计sql查询,从最早的时间点消除查询中的空结果。我有一种感觉,用内部联接替换左联接将解决这个问题。此外,您应该在查询中使用表别名,以避免重写变量表名,并通常提高代码的简洁性/可读性。作为最佳实践,在编写mysql关键字时使用所有大写字母

$test[] = $this->passing($value['Customer'], $value['Project']);
如果由于某种奇怪的原因,内部联接不是解决方案,那么您可以使用HAVING子句筛选出仅在其中一列中具有空值的行

仅供参考:无需如下函数调用即可推入$test:

[[],[],[],[],[],[],[],[],[],[],[{"Username":"arnab@tmail.com","Role":"Software Engineer","today":"139","weekly":"391","monthly":"1149","yearly":"1149"},{"Username":"dolly@fmail.com","Role":"DevOps","today":"251","weekly":"405","monthly":"736","yearly":"736"}]]

试试看,这些答案在Stackoverflow上的价值很低,因为它们对未来数千名研究人员的教育/授权作用微乎其微。@anggriyulio,它不起作用,格式值仍然错误。这些答案在Stackoverflow上的价值很低,因为它们对未来数千名研究人员的教育/授权作用微乎其微。它仍然不起作用,json数组的格式与我的预期不同。我的意思是,我的期望就像这样[[{用户名:arnab@tmail.com,职位:软件工程师,今天:139,每周:391,每月:1149,每年:1149},{用户名:dolly@fmail.com,角色:DevOps,今天:251,每周:405,每月:736,每年:736}],{..}],{..}],{..}],{..}]]您的解决方案给出值[[{..}],{..}],{..}],{..}],[[{..}],{..}],[[..}],{..}],{..}],[{..}],{..}]@aldi,我更新了一行,你能测试一下吗?它会显示数组,请查看输出并在if中更改代码!空的$resultPassing行,您的代码需要根据您的输出进行调整。我仍然不明白man@ZEN Oh sama,您可以与我的代码结合吗?它返回falsepublic函数GetUserAchization{$test=array;$res=array;$data=$this->queries\u trend->getDataCustomer;foreach$data as$key=>$value{array_push$test,$this->passing$value['Customer'],$value['Project'];}$filtered_array=array_filter$test;print_rjson_encodereset$filtered_array;}@aldi你看到我的建议了吗?
[[{"Username":"arnab@tmail.com","Role":"Software Engineer","today":"139","weekly":"391","monthly":"1149","yearly":"1149"},{"Username":"dolly@fmail.com","Role":"DevOps","today":"251","weekly":"405","monthly":"736","yearly":"736"}]]
public function passing($customer, $project) {
return $this->db->query(
    "SELECT t_closed_by AS Username,
            iutypes.user_owner AS Role,
            COUNT(CASE WHEN t_closed_time > CURDATE() - INTERVAL 1 DAY THEN 1 END) AS today,
            COUNT(CASE WHEN t_closed_time > CURDATE() - INTERVAL 7 DAY THEN 1 END) AS weekly,
            COUNT(CASE WHEN t_closed_time > CURDATE() - INTERVAL 1 MONTH THEN 1 END) AS monthly,
            COUNT(CASE WHEN t_closed_time > CURDATE() - INTERVAL 1 YEAR THEN 1 END) AS yearly
    FROM p_".$customer."_".$project."_ticket AS tickets
    INNER JOIN m_event_type AS metypes ON tickets.t_req_type = metypes.ev_type
    INNER JOIN ixt_user_type AS iutypes ON metypes.ev_user_type_target = iutypes.user_type
    WHERE t_status = 9
    GROUP BY t_closed_by"
    )->result_array();
}
$test[] = $this->passing($value['Customer'], $value['Project']);