php数组高级小结(一)
<?php /** * php5.4新增数组定义 */ $items1 = [ 'a','b','c' ]; $items2=[ 'name'=>'andy','age'=>52 ]; print_r($items1); print_r($items2);
<?php /** * 功能描述:把以下数组中 address相同的值合并,count的值相加。这个问题经常会遇到 * $items = array( * array("address"=>"美国", "count"=>123), * array("address"=>"美国", "count"=>34), * array("address"=>"中国", "count"=>2), * array("address"=>"中国", "count"=>20), * array("address"=>"法国", "count"=>345) * ); * 处理后变为: * $items = array( * array("address"=>"美国", "count"=>157), * array("address"=>"中国", "count"=>22), * array("address"=>"法国", "count"=>345) * ); */ $items = array( array("address"=>"美国", "count"=>123), array("address"=>"美国", "count"=>34), array("address"=>"中国", "count"=>2), array("address"=>"中国", "count"=>20), array("address"=>"法国", "count"=>345) ); $map = array(); foreach($items as $item){ $key = $item['address']; /** * isset和array_key_exists的区别 */ //if(isset($map[$key]])){ if(array_key_exists($key,$map)){ $map[$key]['count'] += $item['count']; }else{ $map[$key] = $item; } } print_r(array_values($map));
<?php /** * array_multisort — 对多个数组或多维数组进行排序 */ /** 一 ############################################################################ * 第一个数组是要排序的主要数组。 * 第二个数组中的项目顺序完全和第一个数组中相应的项目顺序一致。 * 数组中的行(值)比较为相同的话就按照下一个输入数组中相应值的大小来排序 */ $ar1 = array("a","b","d", "c"); $ar2 = array(1, 3, "2", 1); array_multisort($ar1, $ar2); /** 二 ############################################################################ * 本例中 data 数组中的每个单元表示一个表中的一行。 * 这是典型的数据库记录的数据集合。 * 例子中的数据如下: * volume | edition * -------+-------- * 67 | 2 * 86 | 1 * 85 | 6 * 98 | 2 * 86 | 6 * 67 | 7 * 数据全都存放在名为 data 的数组中。 * 这通常是通过循环从数据库取得的结果,例如 mysql_fetch_assoc()。 */ $data[] = array('volume' => 67, 'edition' => 2); $data[] = array('volume' => 86, 'edition' => 1); $data[] = array('volume' => 85, 'edition' => 6); $data[] = array('volume' => 98, 'edition' => 2); $data[] = array('volume' => 86, 'edition' => 6); $data[] = array('volume' => 67, 'edition' => 7); /** * 本例中将把 volume 降序排列,把 edition 升序排列。 * 现在有了包含有行的数组,但是 array_multisort() 需要一个包含列的数组 * ,因此用以下代码来取得列,然后排序。 */ // 取得列的列表 foreach ($data as $key => $row) { $volume[$key] = $row['volume']; $edition[$key] = $row['edition']; } // 将数据根据 volume 降序排列,根据 edition 升序排列 // 把 $data 作为最后一个参数,以通用键排序 array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data); print_r($data); /** * 数据集合现在排好序了,结果如下: * volume | edition * -------+-------- * 98 | 2 * 86 | 1 * 86 | 6 * 85 | 6 * 67 | 2 * 67 | 7 */
<?php /** * usort — 使用用户自定义的比较函数对数组中的值进行排序 * 这个方法再某些方面真的很实用,针对这个方法会单独写个文章 */ /** * 二维数组排序,很简单的一个方法 * 下例二维数组按id排序,array_multisort也可实现 */ $items=array( array('id'=>12,'name'=>'张三' ,'age'=>18), array('id'=>8,'name'=>'李四' ,'age'=>30), array('id'=>19,'name'=>'王五' ,'age'=>10), array('id'=>4,'name'=>'赵六' ,'age'=>39), array('id'=>86,'name'=>'孙七' ,'age'=>6), ); usort($items,function($itema,$itemb){ return ($itema['id'] -$itemb['id']); }); print_r($items);
<?php /** * 从m个数中选出n个数来 ( 0 < n <= m), 要求n个数之间不能有重复,其和等于一个定值k, 求一段程序,罗列所有的可能。 * @param int $need 定值 * @param array $arr 选取的数组集合 * @return array 符合的子集合 */ function sel_set($need, $arr) { //子集数2的数组元素数次方 $arr_count = count($arr); $set_count = pow(2, $arr_count); /** * 此方法原理: 对于集合{a, b, c} * 针对其中的元素都有2种状态1在子集中0不在 * 0=>0 0 0 空集不需要考虑 * 1=>0 0 1 => c * 2=>0 1 0 => b * 3=>0 1 1 => b c * 4=>1 0 0 => a * 5=>1 0 1 => a c * 6=>1 1 0 => a b * 7=>1 1 1 => a b c * 也就是将每个子集对应的编号转化为二进制 再去数组取对应元素 */ //set_arr用来存放符合需求的子集 $set_arr = array(); //set_count个子集,所以循环set_count次 for( $i = 1; $i < $set_count; $i++ ) { //tmp用来存放每次子集 $tmp = array(); //将子集对应编号转化二进制 $dec = decbin($i); //数组集合有arr_count个元素,所以将二进制左补0为对应位,以便取数组元素 $dec = str_pad($dec, $arr_count, 0, STR_PAD_LEFT); //对该二进制数循环 判断是否为1 for( $j = 0; $j < $arr_count; $j++ ) { //如果当前位为1, 则将数组对应元素放入子集数组,字符串($dec)可当数组操作 if( 1 == $dec[$j] ) { array_push($tmp, $arr[$j]); } } //判断当前子集之和是否等于设定的定值,符合则存入set_arr if( $need == array_sum($tmp) ) { array_push($set_arr, json_encode($tmp)); } } //返回符合要求的集合 return $set_arr; } //要进行选取的数组,及定值 $need = 18; $arr = array(11, 18, 12, 1, -2, 20, 8, 10, 7, 6); print_r( sel_set($need, $arr) );