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

 

你可能感兴趣的:(PHP)