zoukankan      html  css  js  c++  java
  • 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) );
  • 相关阅读:
    es6箭头函数 this 指向问题
    vue脚手架搭建移动端项目--flexible.js
    vue通过自定义指令 v-py 将名字转拼音
    ES6相关
    闭包
    apply和call与this
    RPC
    Linux根目录下各目录文件类型及各项缩写全称
    网站分析相关
    [转]作为首席架构师,我是如何选择并落地架构方案的?
  • 原文地址:https://www.cnblogs.com/dytl/p/3699832.html
Copyright © 2011-2022 走看看