Php 在Codeigniter上解析并忽略多维数组中的空数据
我有多维数组,从print_rjson_encode$test显示;在我的控制器中,如下所示: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
[[],[],[],[],[],[],[],[],[],[],[{"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']);