array_walk unset数组时的诡异问题及解决

今天采用PHP读了一个xls文件,将xls获取到了数组中。但是由于文件中存在部分空值,因此需要遍历数组将空值去除。这个时候怪异现象就发生了。

1、array_walk不能unset数组本身。

array_walk的回调callback中不能unset删除array_walk的第一个数组参数。这个很好办,我们还可以用use关键字。

2、array_walk中unset数组本身后,下面的数据会发生错乱。

在第一种情况发生后,我们可以通过use关键字来引入数组本身,但是你会发现在回调函数中删除了数组对应的key之后,后面的数据就会出错。原因是数组自身结构发生了改变。

3、最终解决。

其实解决方法很多,比如foreach、array_filter等都可以解决。换个方式即可。而如果还想着用array_walk来解决的话,不妨在array_walk外部定义一个空数组。如下所示:

  1. //测试读数据模板
  2.     public function readxls(){
  3.         $file_path = ROOT_PATH."static".DS."datatags".DS."datatag.xlsx"//文件路径
  4.         $data = OfficeService::getArray($file_path,"id,name,datatype,calunit,desc,note");
  5.         $rdata = [];
  6.         unset($data[0]);
  7.         array_walk($data,function ($valuse(&$rdata){
  8.             if(!emptyempty($val['name']) && !emptyempty($val['datatype'])){
  9.                 $rdata[] = $val;
  10.             }
  11.         });
  12.         echo "<pre>";
  13.         print_r($rdata);
  14.     }

因为很多程序员自身是比较固执的,所以转换下思路也能得到我们想要的结果。把满足条件的数据重新赋值到新数组中即可。

 

你想把广告放到这里吗?

发表评论

您必须 登录 才能发表留言!