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) );

 

posted on 2014-04-29 17:53  珩~  阅读(410)  评论(0编辑  收藏  举报

导航