🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ## **将某个字段相同的值最为新键名重组数组(*)** ``` $arr=array( 0=>array( 'tid'=>26, 'tname'=>'内衣', 'cmid'=>1 ), 1=>array( 'tid'=>25, 'tname'=>'女装', 'cmid'=>1 ), 2=>array( 'tid'=>27, 'tname'=>'男装', 'cmid'=>2 ), 3=>array( 'tid'=>28, 'tname'=>'运动', 'cmid'=>2 ), 4=>array( 'tid'=>29, 'tname'=>'户外', 'cmid'=>2 ), 5=>array( 'tid'=>30, 'tname'=>'男鞋', 'cmid'=>3 ), 6=>array( 'tid'=>31, 'tname'=>'女鞋', 'cmid'=>3 ), 7=>array( 'tid'=>32, 'tname'=>'化妆', 'cmid'=>4 ), ); $item=array(); foreach($arr as $k=>$v){ $item[$v['id']][]=$v; } print_r($item); ``` ``` Array ( [1] => Array ( [0] => Array ( [tid] => 26 [tname] => 内衣 [id] => 1 ) [1] => Array ( [tid] => 25 [tname] => 女装 [id] => 1 ) ) [2] => Array ( [0] => Array ( [tid] => 27 [tname] => 男装 [id] => 2 ) [1] => Array ( [tid] => 28 [tname] => 运动 [id] => 2 ) [2] => Array ( [tid] => 29 [tname] => 户外 [id] => 2 ) ) [3] => Array ( [0] => Array ( [tid] => 30 [tname] => 男鞋 [id] => 3 ) [1] => Array ( [tid] => 31 [tname] => 女鞋 [id] => 3 ) ) [4] => Array ( [0] => Array ( [tid] => 32 [tname] => 个人化妆 [id] => 4 ) ) ) ``` ## **将查出的数据按照ABC进行重组** ``` function get_antibody_pairs(){ $data=\app\common\model\AntibodyPairs::where([ ['status','=',1], ])->order('antibody_pairs_name asc, sort desc, id asc')->select()->toArray(); foreach ($data as $key => $value) { $first_str=mb_substr(trim($value['antibody_pairs_name']),0,1); $data[$key]['first_str']=$first_str; } $item=array(); foreach($data as $k=>$v){ $item[$v['first_str']][]=$v; } return $item; } ``` 结果 ~~~ ^ array:3 [▼ "A" => array:3 [▼ 0 => array:10 [▼ "id" => 1 "create_time" => "2023-08-01 08:15:51" "update_time" => "2023-08-01 08:15:51" "sort" => 50 "status" => 1 "cate_id" => 898 "detection_antibody" => "OAMA00364" "capture_antibody" => "OAMA00515" "antibody_pairs_name" => " Adenovirus hexon pair" "first_str" => "A" ] 1 => array:10 [▶] 2 => array:10 [▶] ] "B" => array:1 [▼ 0 => array:10 [▶] ] "C" => array:1 [▼ 0 => array:10 [▶] ] ~~~ ## **多层次类别组合** ``` /** * 组合多维数组 * @param $cate sql类别二维数据 * @param string $name 子数组键名 * @param int $pid 父id * @return array */ function unlimitedForLayer($cate, $name = 'sub', $pid = 0) { $arr = array(); foreach ($cate as $v) { if ($v['parent_id'] == $pid||$v['pid']==$pid) {//如果某个数据的父id为0时 $v[$name] = unlimitedForLayer($cate, $name, $v['id']); $arr[] = $v; } } return $arr; } ``` 示例 ``` $arr=[ [ 'id'=>"1", 'name'=>"a0", 'pid'=>'0' ], [ 'id'=>"2", 'name'=>"a1", 'pid'=>'1' ], [ 'id'=>"3", 'name'=>"a3", 'pid'=>'1' ], [ 'id'=>"4", 'name'=>"a4", 'pid'=>'1' ], [ 'id'=>"5", 'name'=>"b0", 'pid'=>'0' ], [ 'id'=>"6", 'name'=>"b1", 'pid'=>'5' ], ]; $res=unlimitedForLayer($arr); var_export($res); ``` 结果: ``` array ( 0 => array ( 'id' => '1', 'name' => 'a0', 'pid' => '0', 'sub' => array ( 0 => array ( 'id' => '2', 'name' => 'a1', 'pid' => '1', 'sub' => array ( ), ), 1 => array ( 'id' => '3', 'name' => 'a3', 'pid' => '1', 'sub' => array ( ), ), 2 => array ( 'id' => '4', 'name' => 'a4', 'pid' => '1', 'sub' => array ( ), ), ), ), 1 => array ( 'id' => '2', 'name' => 'a1', 'pid' => '1', 'sub' => array ( ), ), 2 => array ( 'id' => '3', 'name' => 'a3', 'pid' => '1', 'sub' => array ( ), ), 3 => array ( 'id' => '4', 'name' => 'a4', 'pid' => '1', 'sub' => array ( ), ), 4 => array ( 'id' => '5', 'name' => 'b0', 'pid' => '0', 'sub' => array ( 0 => array ( 'id' => '6', 'name' => 'b1', 'pid' => '5', 'sub' => array ( ), ), ), ), 5 => array ( 'id' => '6', 'name' => 'b1', 'pid' => '5', 'sub' => array ( ), ), ) ``` ## **多个数据组合,如商品规格属性** ``` function getArrSet($arrs,$_current_index=-1) { //总数组 static $_total_arr; //总数组下标计数 static $_total_arr_index; //输入的数组长度 static $_total_count; //临时拼凑数组 static $_temp_arr; //进入输入数组的第一层,清空静态数组,并初始化输入数组长度 if($_current_index<0) { $_total_arr=array(); $_total_arr_index=0; $_temp_arr=array(); $_total_count=count($arrs)-1; getArrSet($arrs,0); } else { //循环第$_current_index层数组 foreach($arrs[$_current_index] as $v) { //如果当前的循环的数组少于输入数组长度 if($_current_index<$_total_count) { //将当前数组循环出的值放入临时数组 $_temp_arr[$_current_index]=$v; //继续循环下一个数组 getArrSet($arrs,$_current_index+1); } //如果当前的循环的数组等于输入数组长度(这个数组就是最后的数组) else if($_current_index==$_total_count) { //将当前数组循环出的值放入临时数组 $_temp_arr[$_current_index]=$v; //将临时数组加入总数组 $_total_arr[$_total_arr_index]=$_temp_arr; //总数组下标计数+1 $_total_arr_index++; } } } return $_total_arr; } ``` 测试 ``` $arr=array( array('a','b','c'), array('A','B','C'), array('1','2','3'), array('I','II','III') ); var_export(getArrSet($arr)); /* array ( 0 =>array ( 0 => 'a', 1 => 'A', 2 => '1', 3 => 'I', ), //... 80 =>array ( 0 => 'c', 1 => 'C', 2 => '3', 3 => 'III', ), ) */ ``` 方法2: ``` /** * 返回给的数组的所有组合 * @email kavtong@163.com * @param array $orignal 多维数组 * $orignal = array( * array(1,2,3), * array(4,5,6), * array(7,8,9), * ); * @return array( * array(1,4,7), * array(1,4,8), * array(1,4,9), * ... * array(3,6,7), * array(3,6,8), * array(3,6,9), * ); * 数组元素共: 3*3*3 = 27个 */ function getPermutation(array $orignal = array()){ // 排除非数组的参数 if(!is_array($orignal)){ return []; } // 排除空数组 if(empty($orignal)){ return []; } // 排除只有一个元素的数组 if(count($orignal) < 2){ // 返回的目标数组 $targetTmp = array_shift($orignal); // 返回结果集 return is_array($targetTmp)?$targetTmp:[]; } // 构建目标数组 $target = array_shift($orignal); // 目标数组第一个元素格式化为数组 $target = is_array($target)?$target:[]; // 下一个需要处理的数组 $tmp = array_shift($orignal); // 非正常数据标识 $invalideParam = false; // 数组且不为空 while(is_array($tmp) && !empty($tmp)){ // 验证参数是否是一维数组 if(count($tmp) <> count($tmp,COUNT_RECURSIVE)){ $invalideParam = true; break; } /** * 原始数组的循环 * array( * 0 =>1, * 1 =>2, * 2 =>3, * ); */ // 目标数组的临时变量 $targetTmp = array(); foreach($target as $value){ foreach($tmp as $v){ // 临时数组变量 $targetTmp[] = array_merge((array)$value,[$v]); } } // 原始数组的替换 $target = $targetTmp; // 移动数组的下一个元素 $tmp = array_shift($orignal); } // 存在非一维数组项 if($invalideParam){ return []; } // 返回结果集 return is_array($target)?$target:[]; } $orignal = array( array(1,2,3), array(4,5,6), array(7,8,9), ); $a=getPermutation($orignal); var_export($a); ``` 方法3: ``` class Test{ private $models=[['RED','BLUE','GREEN'],['低配','中配','高配'],['进口','国产']]; private $index=0; /** * 组合 */ public function combineAttributes(){ $m_len=count($this->models); if($m_len>=2){ $result=$this->recurse($this->models[$this->index],$this->models[++$this->index],$m_len); }else{ $result=$this->models[0]; } print_r($result); } /** * 递归拼接属性 * @param $array1 * @param $array2 * @param $m_len * @return array */ public function recurse($array1,$array2,$m_len){ $res=[]; foreach ($array1 as $a1){ foreach ($array2 as $a2){ array_push($res,$a1.'-'.$a2); } } $this->index++; if($this->index<=$m_len-1){ return $this->recurse($res,$this->models[$this->index],$m_len); }else{ return $res; } } } $a=(new Test())->combineAttributes(); /* Array ( [0] => RED-低配-进口 [1] => RED-低配-国产 [2] => RED-中配-进口 [3] => RED-中配-国产 [4] => RED-高配-进口 [5] => RED-高配-国产 [6] => BLUE-低配-进口 [7] => BLUE-低配-国产 [8] => BLUE-中配-进口 [9] => BLUE-中配-国产 [10] => BLUE-高配-进口 [11] => BLUE-高配-国产 [12] => GREEN-低配-进口 [13] => GREEN-低配-国产 [14] => GREEN-中配-进口 [15] => GREEN-中配-国产 [16] => GREEN-高配-进口 [17] => GREEN-高配-国产 ) */ ``` ## **重置数组的键为连续的索引** **1、array_values 函数并不止重置数字索引还会将字符串键名也同样删除并重置。** ~~~ <?php $input = [0 => 233, 99 => 666]; var_dump(array_values($input)); // 结果 [0 => 233, 1 => 66] ~~~ **2、array_slice函数的功能是取出数组的中的一段,但它默认会重新排序并重置数组的数字索引,所以可以利用它重置数组中的数字索引。** ~~~ <?php $input = ['hello' => 'world', 0 => 233, 99 => 666]; var_dump(array_slice($input, 0)); // 结果 ['hello' => 'world', 0 => 233, 1 => 66] ~~~