Skip to content

Latest commit

 

History

History
145 lines (123 loc) · 4.32 KB

Q16-20.md

File metadata and controls

145 lines (123 loc) · 4.32 KB

Q16-20

标签(空格分隔): Driphp


##NO.16 如何在数组的任意位置插入新元素? ###问题描述 这个问题有好几种解决办法,主要是考验对数组函数的灵活掌握能力,也是基本功了~ 如:

INPUT:$arr=['a','b','c','d','e'];//(要求在d的前面插入x)
OUTPUT:$arr=['a','b','c','x','d','e'];

###解决办法

1、使用array_splice()[推荐]
<?php
$arr = array( 'a', 'b', 'c', 'd', 'e' );
$inserted = array( 'x' );
array_splice( $arr, 3, 0, $inserted );
print_r($arr);

2、使用array_merge()、array_slice()进行组合。
<?php
$arr1=['a','b','c','d','e'];
$arr=array_merge(array_slice($arr1,0,3),['x'],array_slice($arr1,3));
print_r($arr);

##NO.17 如何获取今日、昨日、上周、本月的起始时间戳和结束时间戳? ###问题描述 获取特定时间段的时间戳,开发中经常用到,很实用。 ###解决办法 ####NO.1使用mktime()

<?php
//php获取今日开始时间戳和结束时间戳
$beginToday=mktime(0,0,0,date('m'),date('d'),date('Y'));
$endToday=mktime(0,0,0,date('m'),date('d')+1,date('Y'))-1;

//php获取昨日起始时间戳和结束时间戳
$beginYesterday=mktime(0,0,0,date('m'),date('d')-1,date('Y'));
$endYesterday=mktime(0,0,0,date('m'),date('d'),date('Y'))-1;

//php获取上周起始时间戳和结束时间戳
$beginLastweek=mktime(0,0,0,date('m'),date('d')-date('w')+1-7,date('Y'));
$endLastweek=mktime(23,59,59,date('m'),date('d')-date('w')+7-7,date('Y'));

//php获取本月起始时间戳和结束时间戳
$beginThismonth=mktime(0,0,0,date('m'),1,date('Y'));
$endThismonth=mktime(23,59,59,date('m'),date('t'),date('Y'));

####NO.2使用Carbon

Carbon是第三方的很好用的一个时间类库。很灵活、好用。

比如,获得一天的开始、结束时间戳:

<?php
$startDay = Carbon::createFromTimestamp(time())->startOfDay();
$endDay = Carbon::createFromTimestamp(time())->endOfDay();

[Carbon官网][1] ##NO.18 青蛙跳台阶问题 ###问题描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法? ###解决办法 对于第n个台阶来说,只能从n-1或者n-2的台阶跳上来,所以 F(n) = F(n-1) + F(n-2)(也就是斐波拉契数序列)

<?php
function jumpFloor($number){
        if($number<=0) return 0;
        if($number==1) return 1;
        if($number==2) return 2;
        return jumpFloor($number-1)+jumpFloor($number-2);
}

##NO.19 Mysql如何按指定字段自定义排序? ###问题描述: 一张表中有一个字段status:值为1、3、5、7 升序排列:order by status ASC 降序排列:order by status DESC 现在我想按照自定义规则:3、5、1、7 进行排序。如何做到呢? ###解决办法 使用PHP的ORDER BY FIELD 按字段排序语法。

order by FIELD(`status`,3,5,1,7)

建议:逻辑处理最好还是在php、java等语言端做,mysql专注于存储。这样效率会更高一些,特别是对于数据量大的场景。

##NO.20 猴王问题 ###问题描述 有一群猴子排成一圈,按1,2,...,n依次编号。 然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数, 再数到第m只,再把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。

要求:编程模拟此过程,输入m、n, 输出最后那个大王的编号。

###解决办法 ####NO.1使用约瑟夫环递推公式(推荐)

<?php
function yuesefu($n,$m){
    $next = 0;
    for($i=2;$i<=$n;$i++){
        $next = ($next+$m)%$i;
        echo $next;
    }
    return $next+1;
}

echo yuesefu(5,2);

####NO.2 使用数组

 function getKingMonkey($n,$m){ 
        $monkey=range(1,$n); //构建猴子数组 
        $i=0; 
        //遍历猴子数组 
        while( list($k,$value)=each($monkey)){ 
            if(count($monkey)==1){ 
                echo $value. "是猴王"; 
                exit(); 
        } 
         
        if(++$i==$m){ 
           echo $monkey[$k].'踢出去'.'<br/>'; 
           unset($monkey[$k]);  //把变量 清除 
           $i=0;                  //指针归位 
        } 
        //如果已经数到最后的话  则继续进行下一轮的循环 
        if(!current($monkey)){ 
            reset($monkey); 
        } 
     } 
   }