php数组相关转化、函数练习,php数组转化函数
$arr1=array( 0 => Array('子题目' => '11'), 1 => Array('答案' => 'ada'), 2 => Array('解析' => '3a'), 3 => Array('子题目' => '121'), 4 => Array('答案' => 'aa'), 5 => Array('解析' => '3a'), 6 => Array('子题目' => '11'), 7 => Array('答案' => 'aa'), 8 => Array('解析' => '3da'), ); // 将数组 $arr1 转化成 $arr2; $arr2=array( 0 => Array('子题目' => '11','答案' => 'ada','解析' => '3a'), 1 => Array('子题目' => '121','答案' => 'aa','解析' => '3a'), 2 => Array('子题目' => '11','答案' => 'aa','解析' => '3da'), ); // 方法1,利用array_chunk和array_merge()函数; $arr3 = array(); $arr4 = array_chunk($arr1,3); // 将数组分割成 组成小数组,每三个数组元素代表一个小数组; // 注意:此时省略了最后一个参数preserve keys = false参数,默认健名不受保护,即:每个chunk的小数组元素将从0开始索引(关联数组也是从0开始); foreach($arr4 as $keys => $values){ $arr3[$keys] = array_merge($values[0],$values[1],$values[2]); } print_r($arr3); // 方法2: 利用 array_splice()函数和 array_merge()函数; $arr3 = array(); while(0<count($arr1)){ $temp = array_splice($arr1,0,3); $arr3[] = array_merge($temp[0],$temp[1],$temp[2]); // 对数组的融合; } print_r($arr3); // 方法3: 利用 foreach双层遍历后的健名和值,再结合count函数; $arr3 = array(); foreach($arr1 as $keys => $values){ foreach($values as $ks => $vs){ $arr4[$ks] = $vs; } if(count($arr4)==3){ $arr3[] = $arr4; $arr4 = array(); } } print_r($arr3); // 方法4: 利用 foreach双层遍历后的健名和值,再结合if语句; $arr3 = array(); $i = 0; $j = 0; foreach($arr1 as $keys => $values){ foreach($values as $ks => $vs){ $arr3[$i][$ks] = $vs; $j++; } if($j%3==0){ $i++; } } print_r($arr3); // 方法4: 利用 foreach双层遍历后的健名和值,再结合if...else if语句; $arr3 = array(); $i = 0; foreach($arr1 as $key => $values){ foreach($values as $ks => $vs){ if($key==0){ $arr3[$i][$ks]=$vs; }else if($key%3!=0){ $arr3[$i][$ks] = $vs; }else{ $i++; $arr3[$i][$ks] = $vs; } } } print_r($arr3);
// array_combine()构造函数的方法;(和array_merge函数一样,都是针对的数组的值进行的操作); $i = $j = 0; foreach($arr1 as $keys => $values){ foreach($values as $ks => $vs){ $k[] = $ks; $v[] = $vs; $i++; if($i%3==0){ $arr3[$j] = array_combine($k,$v); $k = $v = array(); $j++; } } } print_r($arr3);
2、php二维数组转化;
$arr1 = array( 0 => array('confuguarable_sku' => '0572911','size' => 'XS'), 1 => array('confuguarable_sku' => '0572911','size' => 'S'), 2 => array('confuguarable_sku' => '0572911','size' => 'M'), 3 => array('confuguarable_sku' => '0575213','size' => 25), 4 => array('confuguarable_sku' => '0575213','size' => 26), 5 => array('confuguarable_sku' => '0575213','size' => 25), 6 => array('confuguarable_sku' => '0574843','size' => 28), 7 => array('confuguarable_sku' => '0574843','size' => 30), 8 => array('confuguarable_sku' => '0575494','size' => 'S') ); //输出结果为 /***** array( 0 => array('confuguarable_sku' => '0572911','size' => 'XS','S','M'), 1 => array('confuguarable_sku' => '0575213','size' => 25,26), 2 => array('confuguarable_sku' => '0574843','size' => 28,30), 3 => array('confuguarable_sku' => '0575494','size' => 'S') ); ******/ $arr2 = $arrtemp = array(); foreach($arr1 as $keys => $values){ $arrtemp[$values['confuguarable_sku']][] = $values['size']; } foreach($arrtemp as $kss => $vss){ $arr2[] = array('confuguarable_sku' => $kss,'size' => implode(',',array_unique($vss))); } print_r($arr2);
2、php二维数组整合并求和;
$arr3=[ ['id'=>1,'name'=>'php','num'=>3], ['id'=>2,'name'=>'js','num'=>1], ['id'=>1,'name'=>'php','num'=>2], ['id'=>3,'name'=>'python','num'=>2], ]; //怎么对id相同的对num求和并去重,返回的结果为; $arr=[ ['id'=>1,'name'=>'php','num'=>5], ['id'=>2,'name'=>'js','num'=>1], ['id'=>3,'name'=>'python','num'=>2], ]; $result = []; foreach ($arr3 as $v) { if (isset($result[$v['id']])) { $result[$v['id']]['num'] += $v['num']; } /******* 用array_key_exists()函数:判断健名是否存在数组中; if(array_key_exists($v['id'],$result)){ $result[$v['id']]['num'] += $v['num']; } *********/ else { $result[$v['id']] = $v; } } print_r(array_values($result));
$arr5 = array( array('num'=>5,'period'=>3), array('num'=>10,'period'=>3), array('num'=>15,'period'=>9) ); // 对period相同的值的数组,对num求和,怎么处理变成: $arr6 = array( array('num'=>15,'period'=>3), array('num'=>15,'period'=>9) ); // 方法1: 找出数组中的相同值,用这个值作为新数组的健名(新数组的值如果之前没有相同值,即相同健名的时候,保持原数组;如果之前有相同的值,则对应的元素值相加); $arr2 = array(); foreach($arr5 as $keys => $values){ if(array_key_exists($values['period'],$arr2)){ $arr2[$values['period']]['num'] += $values['num']; }else{ $arr2[$values['period']] = $values; } } //print_r(array_values($arr2)); // 方法2:将相同元素作为一个新临时数组健名,值还是一个数组(分别为原始数组中,需要相加值的各个元素), $arr7 = $temparr = array(); foreach($arr5 as $keys => $values){ $temparr[$values['period']][] = $values['num']; } //print_r($temparr); foreach($temparr as $ks => $vs){ $arr7[] = array('num'=>array_sum($vs),'period'=>$ks); } //print_r($arr7); // 方法3:以相同的元素作为一个新的健名,值为相同num内容的相加; $result = $temp = array(); foreach($arr5 as $kks => $vvs){ list($n,$p) = array_values($vvs); $temp[$p] = array_key_exists($p,$temp) ? ($temp[$p]+$n): $n; } foreach($temp as $kkk => $vvv){ $result[] = array('num' => $vvv,'period' => $kkk); } print_r($result);
$oldarr = [ ['a', 1], ['', 2], ['', 3], ['b', 4], ['', 5], ['c',6], ['',7] ]; /****** 转换为 $newarr = [ 'a'=>'1,2,3', 'b'=>'4,5', 'c'=>'6,7' ]; ********/ $arr2 = array(); foreach($oldarr as $keys => $values){ if($values[0]){ // 分别判读 第一个元素是 abc 还是 ''; $abc = $values[0]; // 此时必须赋值,保持健名为abc;不然不执行条件判读语句的时候,直接用 $values[0] 则表示的是''; $arr2[$abc] = $values[1]; continue; // continue;跳出这个循环,进入下一循环(循环内后面的语句则不再执行); } $arr2[$abc] .= ','.$values[1]; } print_r($arr2);
$arr8 = Array( 0 => Array('id' => 1,'department' => '市场' ), 1 => Array('id' => 1,'department' => '市场' ), 2 => Array('id' => 1,'department' => '市场' ), 3 => Array('id' => 2,'department' => '办公室'), 4 => Array('id' => 2,'department' => '办公室' ), 5 => Array('id' => 2,'department' => '办公室' ), 6 => Array('id' => 3,'department' => '收发室') ); /****** 循环后这样显示 id department 统计 1 市场 3 2 办公室 3 3 收发室 1 *******/ $arr9 = array(); foreach($arr8 as $keys => $values){ if(isset($arr9[$values['id']])){ $arr9[$values['id']]['count'] += 1; }else{ $arr9[$values['id']] = $values; $arr9[$values['id']]['count'] = 1; } } foreach($arr9 as $kks => $vvs){ echo 'id='.$vvs['id'].' department='.$vvs['department'].' 统计='.$vvs['count']; echo '<br/>'; }
$arr10 = Array(0 => Array('initial' => 'A','typename' => '奥迪'), 1 => Array('initial' => 'F','typename' =>'F1'), 2 => Array('initial' => 'F','typename' => 'F2') ); //怎么根据initial相同的分到同一个里面 /**** A{[0] => Array([initial] => A,[typename] => 奥迪)} F{[0] => Array([initial] => F,[typename] =>F1), [1] => Array([initial] => F,[typename] => F2) } ******/ $arr11 = array(); foreach($arr10 as $keys => $values){ $arr11[$values['initial']][] = $values; } print_r($arr11);
$arr8 = array( array('id'=>1,'name'=>'小明','time'=>'1'), array('id'=>1,'name'=>'小明','time'=>'2'), array('id'=>1,'name'=>'小明','time'=>'3'), array('id'=>2,'name'=>'小写','time'=>'4'), array('id'=>3,'name'=>'小明','time'=>'5'), array('id'=>2,'name'=>'小写','time'=>'6'), array('id'=>5,'name'=>'小明','time'=>'7'), ); //如何去除相同的id,保留第一个值, //比如id=1的 保留 array('id'=>1,'name'=>'小明','time'=>'1'),其他相同的数组都删掉; $arr9 = array(); foreach($arr8 as $keys => $values){ if(array_key_exists($values['id'],$arr9)){ continue; } $arr9[$values['id']] = $values; } //print_r($arr9);
$arr7 = array( array('user_id'=>1,'brand_id'=>'aaa','brand_name'=>'1'), array('user_id'=>1,'brand_id'=>'aaa','brand_name'=>'2'), array('user_id'=>1,'brand_id'=>'aaa','brand_name'=>'3'), array('user_id'=>2,'brand_id'=>'ddd','brand_name'=>'4'), array('user_id'=>3,'brand_id'=>'ddd','brand_name'=>'5') ); $newarr = array(); foreach($arr7 as $_arr){ if(!isset($newarr[$_arr['user_id']])){ $newarr[$_arr['user_id']] = $_arr; } } //print_r($newarr);
$a1=array('0' => array( "id" => '1', 'name'=>'aa' ),'1' => array( "id" => '2', 'name'=>'bb' )); $a2=array('0' => array( "id" => '1', 'pwd'=>'888' ),'1' => array( "id" => '2', 'pwd'=>'999' )); /****** 合并成: $a1_a2=array( '0' => array( "id" => '1', 'name'=>'aa' , 'pwd'=>'888' ), '1' => array( "id" => '2', 'name'=>'bb' , 'pwd'=>'999' ), ); ******/ $a1new = array(); $a2new = array(); $newarray = array(); foreach($a1 as $keys => $values){ $a1new[$values['id']] = $values['name']; // array(1=>'aa',2=>'bb'); } foreach($a2 as $keys => $values){ $a2new[$values['id']] = $values['pwd']; // array(1=>'888',2=>'999'); } foreach($a1new as $keys => $values){ $newarray[] = array('id'=>$keys,'name'=>$values,'pwd'=>isset($a2new[$keys])? $a2new[$keys]:''); } print_r($newarray);
3、php二维数组排序;
//假如有以下数组: $beforeSort = [ "0" => ["name" => "张三", "english" => 80, "chinese" => 60, "math" => 50 ], "1" => ["name" => "李四", "english" => 50, "chinese" => 60, "math" => 70 ], "2" => ["name" => "老王", "english" => 30, "chinese" => 50, "math" => 80 ], ]; // 现在需要在数组中按照 chinese 顺序,假如有相同,就按 math 顺序,最后得到的应该是如下的数组: $afterSort = [ "2" => ["name" => "老王", "english" => 30, "chinese" => 50, "math" => 80 ], "0" => ["name" => "张三", "english" => 80, "chinese" => 60, "math" => 50 ], "1" => ["name" => "李四", "english" => 50, "chinese" => 60, "math" => 70 ], ]; // 方法1:利用 array_multisort 函数; $chinese = $math = array(); foreach($beforeSort as $keys => $values){ $chinese[$keys] = $values['chinese']; // $chinese = array(0=>60,1=>60,2=>50); // 等价于: //$chinese = array_column($beforeSort,'chinese'); $math[$keys] = $values['math']; // $math = array(0=>60,1=>70,2=>80); // 等价于: //$math = array_column($beforeSort,'math'); } array_multisort($chinese,SORT_ASC,$math,SORT_ASC,$beforeSort); // 对$beforeSort数组进行排序,先按照$chinese的升序,再按照$math的升序; print_r($beforeSort); // 方法2: 利用usort函数;
// 注意:在第一个参数小于,等于或大于第二个参数时,该比较函数必须相应地返回一个小于,等于或大于 0 的整数; function myfun1($a,$b){ if($a['chinese'] == $b['chinese'] ){ return 0; } return ($a['chinese'] > $b['chinese']) ? 1 : -1; } function myfun2($a,$b){ if($a['math'] == $b['math'] ){ return 0; } return ($a['math'] < $b['math']) ? 1 : -1; } usort($beforeSort,'myfun1'); // 满足了 > (1) 条件,所以chinese 从小到大排序; usort($beforeSort,'myfun2'); // 不满足 (<) (-1) 的条件,所以 math 从大到小排序;(在第一次排序的基础上); print_r($beforeSort);
4、php二维数组去重;
$arr4=array(1=>array('a','b'), 2=>array('a','c'), 3=>array('a','b')); //只输出第一项(第一项和第三项相同,去第三项)和第二项这个怎么解决? foreach($arr4 as $keys => $values){ $arr5[$keys] = implode(' ',$values); } $arr5 = array_unique($arr5); foreach($arr5 as $ks => $vs){ $arr6[$ks] = explode(' ',$vs); } print_r($arr6);
$tid='1,2,2,4,4,5'; //变为$tid='1,2,4,5'; $arr = explode(',',$tid); echo implode(',',array_unique($arr));
PHP之友评论