在php中,通过join查询得到的数据经常出现:$data=[{id=>1,name=>a,age=>a},{id=>1,name=>b,age=>b},{id=>2,name=>c,age=>c},{id=>3,name=>f,age=>f},{id=>2,name=>d,age=>d},];这种格式的数据其实很常见。其实我们想要的数据效果是:$data=[[id=>1,user_info=>[[name=>a,age=>a],[name=>b,age=>b]]],[id=>2,user_info=>[[name=>c,age=>c],[name=>d,age=>d]]],[id=>3,user_info=>[[name=>f,age=>f]]],];所以我们需要各种foreach来处理这些功能;这里记录下,两个函数数组的黑名单:/***获取黑名单中数据的数组*@paramarray$arrsourcearray*@paramarray$listwhitelist*@returnarray*@example*$arr=['a'=>1,'b'=>2,'c'=>3,'d'=>4]*$list=['d','c'];*$return=['a'=>1,'b'=>2];*/publicfunctionarray_black_list(Array$arr,Array$list){returnarray_diff_key($arr,array_flip($list));}数组的白名单/***Array获取白名单中的数据*@paramarray$arr源数组*@param数组$list白名单*@return数组*@example*$arr=['a'=>1,'b'=>2,'c'=>3,'d'=>4]*$list=['d','c'];*$return=['c'=>3,'d'=>4];*/publicfunctionarray_white_list(Array$arr,Array$list){returnarray_intersect_key($arr,array_flip($list));}利用黑名单和白名单,可以轻松实现以上数据格式转换:/***重复数据处理(通常是leftJoin数据结构Perfect)*leftJoin查询的多组数据,根据primary_id修改数据结构,保存为字段=>[{},{},{}]类似结构*效果:$数据=[{id=>1,name=>a,age=>a},{id=>1,name=>b,age=>b},{id=>2,name=>c,age=>c},{id=>3,name=>null,age=>null}],$fieldArr=['name','age']*返回[{id=>1,repeat_info=>[{name=>a,age=>a},{name=>b,age=>b}]},{id=>2,repeat_info=>[{name=>c,age=>c}]},{id=>3,repeat_info=>[]}]*@param$data数组原始数据;*@param$fieldArr数组必填字段,*@paramstring$primary_key重复数据凭证;(一般使用主键id)*@paramstring$repeat_name重复数据保存数组的字段名*@returnarray*/publicfunctiondealRepeatData(Array$data,Array$fieldArr,$primary_key='id',$repeat_name='repeat_info'){$res=[];//通过黑名单获取唯一值,合并成一个按id分类的数组;foreach($dataas$nre){$res[$nre[$primary_key]]=$res[$nre[$primary_key]]??$this->array_black_list($nre,$fieldArr);}//通过白名单获取重复值,合并到黑名单的$repeat_name字段中;foreach($dataas$re){$res[$re[$primary_key]][$repeat_name][]=$this->array_white_list($re,$fieldArr);}返回array_values($res);}
