php程序员面试之百度面试题

 更新时间:2016年11月25日 14:56  点击:1982
面试题不同公司不一样像百度公司要求算法高这个也能理解了,下面整理了一道据说是百度的面试题,我们来看看它的算法与答案吧。

据说是一个百度php的面试题,已给定一个数组:

$arr = array(‘b’=>’a’, ‘c’=>’a’, ‘e’=>’b’, ‘d’=>’b’, ‘f’=>’c’, ‘g’=>’e’, ‘h’=>’f’);


写一个算法,完成到以下格式的转换:

array (

    'a' => array (

        'b' => array (

            'e' => array (

                [0] => 'g',

            ),

            [0] => 'd',

        ),

        'c' => array (

            'f' => array (

                [0] => 'h',

            ),

        ),

    ),

)


这个结构应该属于一种Trie树。当时在写的时候由于没发现array_keys()函数第二个参数(汗一个先),于是写了以下这个方法来实现。

function getsomething(&$arr, &$re, $c='') {

    $c or $c=array_shift(array_keys($arr));//当未指定开始位置时 从数组第一个元素开始

    $flag= false;   //标记 当有和$c对应的key(键)时 设为true

    while($k = array_search($c, $arr)) {    //循环获取值为$c的key。

        getsomething($arr, $re[$c], $k);    //一直递归到最后没有key对应时

        unset($arr[$k]);        //移除  这个元素已经不会再使用了

        $flag = true;

    }

    //当flag为真时 说明之前获得过正常存在的key,不会继续生成[0]下标的元素

    if(! $flag) return $re[] = $c; 

}

//调用

getsomething($arr, $re, 'a');


虽然有点儿奇葩,至少还是实现了。以下是某网友使用array_keys()的另一解法:

function _array_keys($k, $arr) {

    $return = array();

    if($ret = array_keys($arr, $k)) {

        foreach($ret as $v) {

            if($t = _array_keys($v, $arr)) {

                $return[$v] = $t;

            } else {

                $return[] = $v;

            }

        }

    }

    return $return;

}

在php中file_exists与is_file,is_dir都可以用来检测目录或文件是否存在了,那么它们三者的具体区别在哪里呢,下面我们一起来看看吧。


很显然file_exists是受了asp的影响,因为asp不但有fileExists还有folderExists,driverExists,那么PHP中file_exists是什么意思呢?

PHP的 file_exists = is_dir + is_file

它既可以判断文件是否存在,又可以判断目录是否存在。但这样一个全面的函数执行效率非常低,就像asp中request不指定是form,还是get,cookies,所以结论是:

◦如果要判断目录是否存在,请用独立函数 is_dir(directory)
◦如果要判断文件是否存在,请用独立函数 is_file(filepath)
--------------------------------------------------------------------------------------

is_file 只判断文件是否存在;
file_exists 判断文件是否存在或者是目录是否存在;
is_dir 判断目录是否存在;
--------------------------------------------------------------------------------------

查看手册,虽然这两个函数的结果都会被缓存,但是is_file却快了N倍。
还有一个值得注意的:
文件存在的情况下,is_file比file_exists要快N倍;
文件不存在的情况下,is_file比file_exists要慢;
结论是,file_exits函数并不会因为该文件是否真的存在而影响速度,但是is_file影响就大了。

写程序验证一下:

分别执行1000次,记录所需时间。

文件存在(当前目录)

is_file:0.4570ms

file_exists:2.0640ms

文件存在(绝对路径3层/www/hx/a/)

is_file:0.4909ms

file_exists:3.3500ms

文件存在(绝对路径5层/www/hx/a/b/c/)

is_file:0.4961ms

file_exists:4.2100ms

文件不存在(当前目录)

is_file:2.0170ms

file_exists:1.9848ms

文件不存在(绝对路径5层/www/hx/a/b/c/)

is_file:4.1909ms

file_exists:4.1502ms

目录存在

file_exists:2.9271ms

is_dir:0.4601ms

目录不存在

file_exists:2.9719ms

is_dir:2.9359ms

is_file($file)

file_exists($file)

当$file是目录时,is_file返回false,file_exists返回true

文件存在的情况下,is_file比file_exists要快得多;

要检测文件所在的目录越深,速度差越多,但至少快4倍。

文件不存在的情况下,is_file比file_exists要慢一点点,但可以忽略不计。

目录存在的情况下,is_dir比file_exists要快得多;

目录不存在的情况下,is_dir比file_exists要慢一点点,但可以忽略不计。

结论:

如果要判断文件是否存在,用函数 is_file(),

如果要判断目录是否存在,用函数 is_dir(),

好像没地方需要用file_exists了,不确定传入的参数是文件还是目录的时候用

后缀名指的是文件拓展名了,我们在php中可以通过许多的方法来获得了,下面一起来看小编整理的一些例子吧。

获取文件后缀的方法有很多种,差不多能总结出7,8种,原理基本上都分成两种。第一种:得到文件名中最后一个“.”的位置,然后再进行截取;第二种:用explode将文件名以“.”进行分割成数组,再取数组中最后一个值。

具体实现源码参考:

$file1 = 'e:/ddd/ww/file.doc.zip';

$file2 = 'e:/ddd/ww/file.jpg.png';

$suffix1 = end( explode('.', $file1) ); //先把文件名以“.”分割成数组,再用end函数取数组最后一个值

$suffix2 = substr( $file2, strrpos($file2, '.')+1 ); //strrpos先计算出最后一个“.”的位置,再用substr截取

echo $suffix1.'-'.$suffix2;

静态变量与普通变量的区别在哪里呢,对于许多初学php的朋友来讲可能不是点击的明白了,今天我们来看看php中static 静态变量和普通变量的区别吧。

在变量的前面加上static 就构成了静态变量(static 变量)。

static变量和普通变量的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。

static变量和普通变量的区别:

static全局变量与普通全局变量区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。

1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)

2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)

3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。

static 变量的好处:

不会被其他文件所访问,修改
其他文件中可以使用相同名字的变量,不会发生冲突。
内存中的位置:静态存储区
初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。

 注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。
当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区中。
普通函数实例:

<?php
function Test() {
$w3sky = 0;
echo $w3sky;
$w3sky++;
//函数每次调用时都会将 $w3sky 的值设为 0 并输出 "0"。将变量加一的 $w3sky++ 没有其到效果,因为一旦退出本函数则变量 $w3sky 就不存在了。
}


要将变量 $w3sky 定义为静态(static)的,代码如下:

<?php
function Test()
{
static $w3sky = 0;
echo $w3sky;
$w3sky++;
} //本函数每调用Test()都会输出 $w3sky 的值并加一。
?>


静态变量也提供了一种处理递归函数的方法。递归函数是一种自己调用自己的方法。写递归函数时要小心,因为可能会无穷递归下去,没有出口.务必确保 有方法来中止递归。以下这个简单的函数递归计数到 10,使用静态变量 $count 来判断何时停止, 静态变量与递归函数的例子:

<?PHP
function Test()
{
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
Test();
}
$count--;
}
?>

注: 静态变量不能用表达式的方式声明例如:static $int = 1+2; 这种方式就是错的  而static $int = 1; 这种声明方式则是对的。

本文章为各位整理了一些在开发中常用的类了,这些类都非常的实用希望对各位同学会带来帮助。


PHP常用类库

数组类
class libArray
{
    /**
     * 多维数组合并
     * @return array
     */
    public static function merge ()
    {
        $args = func_get_args();
        $array = [];
        foreach ( $args as $arg ) {
            if ( is_array($arg) ) {
                foreach ( $arg as $k => $v ) {
                    if ( is_array($v) ) {
                        $array[$k] = isset($array[$k]) ? $array[$k] : [];
                        $array[$k] = self::merge($array[$k], $v);
                    } else {
                        $array[$k] = $v;
                    }
                }
            }
        }
        return $array;
    }

    /**
     * 多维to一维
     * [1=>['a'=>'v1']] to ['1|a'=>'v1']
     * @param array $array
     * @param string $delimiter
     * @param string $key
     * @return array
     */
    public static function mTo1 (array $array, $delimiter = '|', $key = '')
    {
        $data = [];
        if ( !is_array($array) ) {
            return $data;
        }
        foreach ( $array as $k => $v ) {
            $keyNew = trim($key.$delimiter.$k, $delimiter);
            if ( is_array($v) ) {
                $data = array_merge($data, self::mTo1($v, $delimiter, $keyNew));
            } else {
                $data[$keyNew] = $v;
            }
        }
        return $data;
    }

    /**
     * 数组排序
     * @param array $array
     * @param $column
     * @param bool $reverse
     * @return bool
     */
    public static function sort (array &$array, $column, $reverse = FALSE)
    {
        $arrColumn = [];
        foreach ( $array as $key => $val ) {
            $arrColumn[$key] = $val[$column];
        }
        return array_multisort($arrColumn, $reverse ? SORT_DESC : SORT_ASC, $array);
    }

    /**
     * 添加索引
     * @param array $array
     * @param $key
     * @return array
     */
    public static function index (array $array, $key)
    {
        $ret = [];
        foreach ( $array as $val ) {
            $ret[$val[$key]] = $val;
        }
        return $ret;
    }

    /**
     * 添加前后缀
     * @param $array
     * @param null $pre
     * @param null $suf
     * @return array
     */
    public static function addFix (array $array, $pre = NULL, $suf = NULL)
    {
        $ret = [];
        foreach ( $array as $key => $val ) {
            $ret[$key] = $pre.$val.$suf;
        }
        return $ret;
    }
}


数据检查类
class libCheck
{
    /**
     * 是否为IP(IPv4)
     * @param $ip
     * @return bool
     */
    public static function isIP ($ip)
    {
        $isIP = filter_var($ip, FILTER_VALIDATE_IP) ? TRUE : FALSE;
        return $isIP;
    }

    /**
     * 是否为邮箱地址
     * @param $mail
     * @return bool
     */
    public static function isMail ($mail)
    {
        $isMail = filter_var($mail, FILTER_VALIDATE_EMAIL) ? TRUE : FALSE;
        return $isMail;
    }

    /**
     * 是否为URL
     * @param $url
     * @return bool
     */
    public static function isURL ($url)
    {
        $isMail = filter_var($url, FILTER_VALIDATE_URL) ? TRUE : FALSE;
        return $isMail;
    }

    /**
     * 是否为正整数
     * @param $num
     * @return bool
     */
    public static function isPosiInt ($num)
    {
        $isPosiInt = is_int($num) && $num > 0;
        return $isPosiInt;
    }

    /**
     * 是否在范围内
     * @param $num
     * @param int $min
     * @param null $max
     * @return bool
     */
    public static function isBetween ($num, $min = 0, $max = NULL)
    {
        $isBetween = $num >= $min;
        if ( $max ) {
            $isBetween = $isBetween && $num <= $max;
        }
        return $isBetween;
    }

    /**
     * 是否为有效长度
     * @param $str
     * @param int $min
     * @param null $max
     * @return bool
     */
    public static function isValidLen ($str, $min = 1, $max = NULL)
    {
        $length = mb_strlen($str);
        $isValidLen = self::isBetween($length, $min, $max);
        return $isValidLen;
    }
}


文件类

class libFile
{
    /**
     * 获取目录下所有文件
     * @param $path
     * @return array
     */
    public static function getFiles ($path)
    {
        $path = self::formatePath($path);
        $dir = opendir($path);
        $files = [];
        while ( ($filename = readdir($dir)) !== FALSE ) {
            if ( $filename != '.' && $filename != '..' ) {
                $files[] = $path.$filename;
            }
        }
        closedir($dir);
        return $files;
    }

    /**
     * 按模式取目录下文件
     * @param $path
     * @param $pattern
     * @return array
     */
    public static function getFilesByPattern ($path, $pattern)
    {
        $path = self::formatePath($path);
        $filePattern = sprintf('%s%s', $path, $pattern);
        return glob($filePattern);
    }

    /**
     * 获取最后修改时间
     * @param $path
     * @return int
     */
    public static function getModifiedTime ($path)
    {
        return filemtime($path);
    }

    /**
     * 格式化路径
     * @param $path
     * @return string
     */
    public static function formatePath ($path)
    {
        return rtrim($path, '/').'/';
    }
}


HTTP类

class libHttp
{
    const TIMEOUT_DEFAULT = 30;
    private $_ch = NULL;

    /**
     * GET方法
     * @param $url
     * @param array $options
     * @return bool|mixed
     */
    public function get ($url, $options = [])
    {
        return $this->_send($url, NULL, NULL, $options);
    }

    /**
     * POST方法
     * @param $url
     * @param array $params
     * @param array $options
     * @return bool|mixed
     */
    public function post ($url, $params = [], $options = [])
    {
        return $this->_send($url, 'POST', $params, $options);
    }

    /**
     * 错误信息
     * @return string
     */
    public function error ()
    {
        return curl_error($this->_ch);
    }

    /**
     * 错误号
     * @return int
     */
    public function errno ()
    {
        return curl_errno($this->_ch);
    }

    /**
     * @param $url
     * @param string $method
     * @param array $params
     * @param array $options
     * @return bool|mixed
     */
    private function _send ($url, $method = 'GET', $params = [], $options = [])
    {
        $this->_ch = curl_init($url);
        curl_setopt($this->_ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($this->_ch, CURLOPT_CONNECTTIMEOUT, self::TIMEOUT_DEFAULT);
        if ( $method == 'POST' ) {
            $options[CURLOPT_POST] = TRUE;
            $options[CURLOPT_POSTFIELDS] = $params;
        }
        curl_setopt_array($this->_ch, $options);
        $result = curl_exec($this->_ch);
        return ($this->errno() == 0) ? $result : FALSE;
    }

    /**
     * __destruct
     */
    public function __destruct ()
    {
        curl_close($this->_ch);
    }
}


字符串类

class libString
{
    /**
     * 随机字符串
     * @param int $length
     * @param bool $num
     * @param bool $lower
     * @param bool $upper
     * @return string
     */
    public static function rand ($length=5, $num=TRUE, $lower=TRUE, $upper=TRUE)
    {
        $str = '';
        $num && $str .= '0123456789';
        $lowercase && $str .= 'abcdefghijklmnopqrstuvwxyz';
        $uppercase && $str .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $rand = substr(str_shuffle($str), -$length);
        return $rand;
    }

    /**
     * 字符串截取(单次)
     * @param $ld
     * @param $rd
     * @param $str
     * @return string
     */
    public static function sub ($ld, $rd, $str)
    {
        $start = strpos($str, $ld) + strlen($ld);
        $end = strpos($str, $rd, $start);
        $data = substr($str, $start, $end - $start);
        return $data;
    }

    /**
     * 字符串截取(批量)
     * @param $ld
     * @param $rd
     * @param $str
     * @return array
     */
    public static function subs ($ld, $rd, $str)
    {
        $data = [];
        $lLen = strlen($ld);
        $rLen = strlen($rd);
        $offset = 0;
        while ( ($start = strpos($str, $ld, $offset)) !== FALSE ) {
            $start += $lLen;
            $end = strpos($str, $rd, $start);
            $data[] = substr($str, $start, $end - $start);
            $offset = $end + $rLen;
        }
        return $data;
    }

    /**
     * 生成唯一ID
     * @return string
     */
    public static function uniqid ()
    {
        return md5(uniqid(rand(), true));
    }
}


其它工具类

class libTool
{
    /**
     * ip->int
     * @param $ip
     * @return string
     */
    public static function ip2long ($ip)
    {
        $long = sprintf('%u', ip2long($ip));
        return $long;
    }

    /**
     * 系统负载
     * @return mixed
     */
    public static function loadAvg ()
    {
        $load = sys_getloadavg()[0];
        return $load;
    }

    /**
     * 写日志文件
     * @param $file
     * @param $msg
     * @param bool $newLine
     */
    public static function log ($file, $msg, $newLine = TRUE)
    {
        $newLine && $msg .= "\n";
        file_put_contents($file, $msg, FILE_APPEND);
    }

    /**
     * 内存使用量
     * @return float
     */
    public static function memoryUsage ()
    {
        $memery = memory_get_usage() / 1024 / 1024;
        return $memery;
    }

    /**
     * 浏览器变量输出
     * @param $var
     * @param bool|FALSE $return
     * @param bool|TRUE $strict
     * @return bool|mixed|string
     */
    public static function dump ($var, $return = FALSE, $strict = TRUE)
    {
        if (!$strict) {
            if (ini_get('html_errors')) {
                $output = print_r($var, TRUE);
                $output = sprintf('<pre>%s</pre>', htmlspecialchars($output, ENT_QUOTES));
            } else {
                $output = print_r($var, TRUE);
            }
        } else {
            ob_start();
            var_dump($var);
            $output = ob_get_clean();
            if (!extension_loaded('xdebug')) {
                $output = preg_replace('/\]\=\>\n(\s+)/m', '] => ', $output);
                $output = sprintf('<pre>%s</pre>', htmlspecialchars($output, ENT_QUOTES));
            }
        }

        if ($return) {
            return $output;
        } else {
            echo $output;
            return TRUE;
        }
    }
}

[!--infotagslink--]

相关文章

  • 百度网盟和google网盟推广那种效果好

    专做了百度和google的网盟推广以作推广效果的评估比较。百度的周期为6天,google为4天。   从百度的统计数据可以看出这六天的点击次数总共为464,平均点击花费了0.30元...2017-07-06
  • 如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)

    以下是使用js代码实现百度地图计算两地距离,代码如下所示:<script src="js/jquery-1.9.0.js" type="text/javascript" language="javascript"></script><script language="javascript" type="text/javascript" src="js/...2015-10-30
  • 百度联盟封号了解封申请攻略

    百度联盟封号对于许多的站长来说肯定是会影响到心情的,那么既然是百度联盟封号了我们就肯定有一些原因的,虽然不是你自己搞的或一些其它因素都有可能,我们下面整理一下百...2016-10-10
  • 7道关于JS this的面试题,你能答对几个

    这篇文章主要给大家介绍了7道关于JS this的面试题,来看看你能答对几个,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-05
  • 基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标

    本文给大家介绍javascript实现高德地图和百度地图提取行政区边界经纬度坐标的相关知识,本文实用性非常高,代码简单易懂,需要的朋友参考下吧...2016-01-24
  • 网站被百度拔毛 一月重新回归经验分离

    网站被K后,笔者做的第一件事便是在网站上增加更新模块。百度算法更新,对于网站内容给予了相当大的权重,这是笔者网站最欠缺的部分,保证了及时的更新便有了吸引蜘蛛爬取的...2016-10-10
  • 如何用PS将百度熊抱枕做成大头枕?

    我们知道百度熊抱枕很大,只想要百度熊的大头,该怎么办呢?下面我们就来看看详细的教程。 1、首先打开photoshopCS6软件,新建一个“1600*1600”的白色背景图,并从右上角...2016-12-31
  • 如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)

    以下是使用js代码实现百度地图计算两地距离,代码如下所示:<script src="js/jquery-1.9.0.js" type="text/javascript" language="javascript"></script><script language="javascript" type="text/javascript" src="js/...2015-10-30
  • 怎么对百度网页搜索的检索指标进行评估

    用户为满足自己某种需求而来到搜索引擎的,判断用户的需求是做好网站的开始。只有准确地判断出用户需求,了解用户搜索的目的,才能合理地衡量出一个网站结果的质量好,做好搜...2016-10-10
  • 如何应对百度更新改动关键词

    网页头部head 部分:TITLE 、<mtea>部分 网站描述Description、keyword 内容中的关键词,大家优化时也都比较重视这部分的关键词优化,因为在查询搜索结果时此处出现的关键词...2017-07-06
  • JS实现获取来自百度,Google,soso,sogou关键词的方法

    这篇文章主要介绍了JS实现获取来自百度,Google,soso,sogou关键词的方法,结合实例形式分析了js获取来路页面的方法与相关搜索引擎关键词的处理技巧,需要的朋友可以参考下...2017-01-09
  • WinForm调用百度地图接口用法示例

    这篇文章主要介绍了WinForm调用百度地图接口用法,结合具体实例形式简单分析了WinForm WebBrower控件与前端百度接口交互的相关操作技巧,需要的朋友可以参考下...2020-06-25
  • Illustrator绘制百度云标志LOGO教程

    今天小编在这里就来给Illustrator的这一款软件的使用者们来说一说绘制百度云标志LOGO的教程,各位想知道具体绘制方法的使用者,那么下面就快来跟着小编一起看一看教程。...2016-09-14
  • PHPCMS实现自动推送URL到百度站长平台

    我们一起来看一篇关于PHPCMS实现自动推送URL到百度站长平台,希望此教程能够帮助到各位朋友。 百度站长平台开放url推送接口,可以使用调用接口的形式主动及时推送u...2016-11-25
  • 百度不更新网站原因分析

    百度不更新网站原因分析 今天我们来看一篇关于 哦,你是不是其它的之一呢,好了下面来看看各位站长总结了来百度不更新网页的原因吧。 一、首页的大flash图片。   ...2016-10-10
  • 百度指数工具分析关键词的价值

    仅仅凭自己的感觉是根本无法判断这个关键词的价值的,那么这时候我们就可以适当的应用一下百度指数工具,利用这个工具我们可以挖掘出一些有价值的关键词。 一、从百...2016-10-10
  • 解答“60k”大佬的19道C#面试题(上)

    这篇文章主要解答了“60k”大佬的19道C#面试题中的10道,文中的面试题比较小众,作者给了不错的答案,相信对你以后的面试有所帮助,感兴趣就来了解下...2020-06-25
  • C# 10分钟完成百度人脸识别(入门篇)

    这篇文章主要介绍了C# 10分钟完成百度人脸识别(入门篇),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 网站的聚合页或站内搜索页怎么会沦为百度搜索打击对象

    网站运营是很多人向往的赚钱方法,一些网站会发现,自己做的聚合页面和站内搜索页面被百度搜索无情打击,这是为什么,不知道原因的伙伴下面跟小编一起来看看。 今天杨子...2017-07-06
  • php中curl模拟登陆用户百度知道的例子

    以前讲过很多关于curl模拟登陆用户的一些例子了,今天我来介绍一个登录百度产品的一个php程序代码,希望文章给你带来帮助,此文章只供学习使用。 最近弄了一个工具,希望...2016-11-25