php程序员面试之百度面试题
据说是一个百度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;
}
}
}
相关文章
- 专做了百度和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的面试题,来看看你能答对几个,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-05
基于JavaScript实现高德地图和百度地图提取行政区边界经纬度坐标
本文给大家介绍javascript实现高德地图和百度地图提取行政区边界经纬度坐标的相关知识,本文实用性非常高,代码简单易懂,需要的朋友参考下吧...2016-01-24- 网站被K后,笔者做的第一件事便是在网站上增加更新模块。百度算法更新,对于网站内容给予了相当大的权重,这是笔者网站最欠缺的部分,保证了及时的更新便有了吸引蜘蛛爬取的...2016-10-10
- 我们知道百度熊抱枕很大,只想要百度熊的大头,该怎么办呢?下面我们就来看看详细的教程。 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 WebBrower控件与前端百度接口交互的相关操作技巧,需要的朋友可以参考下...2020-06-25
- 今天小编在这里就来给Illustrator的这一款软件的使用者们来说一说绘制百度云标志LOGO的教程,各位想知道具体绘制方法的使用者,那么下面就快来跟着小编一起看一看教程。...2016-09-14
- 我们一起来看一篇关于PHPCMS实现自动推送URL到百度站长平台,希望此教程能够帮助到各位朋友。 百度站长平台开放url推送接口,可以使用调用接口的形式主动及时推送u...2016-11-25
- 百度不更新网站原因分析 今天我们来看一篇关于 哦,你是不是其它的之一呢,好了下面来看看各位站长总结了来百度不更新网页的原因吧。 一、首页的大flash图片。 ...2016-10-10
- 仅仅凭自己的感觉是根本无法判断这个关键词的价值的,那么这时候我们就可以适当的应用一下百度指数工具,利用这个工具我们可以挖掘出一些有价值的关键词。 一、从百...2016-10-10
- 这篇文章主要解答了“60k”大佬的19道C#面试题中的10道,文中的面试题比较小众,作者给了不错的答案,相信对你以后的面试有所帮助,感兴趣就来了解下...2020-06-25
- 这篇文章主要介绍了C# 10分钟完成百度人脸识别(入门篇),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 网站运营是很多人向往的赚钱方法,一些网站会发现,自己做的聚合页面和站内搜索页面被百度搜索无情打击,这是为什么,不知道原因的伙伴下面跟小编一起来看看。 今天杨子...2017-07-06
- 以前讲过很多关于curl模拟登陆用户的一些例子了,今天我来介绍一个登录百度产品的一个php程序代码,希望文章给你带来帮助,此文章只供学习使用。 最近弄了一个工具,希望...2016-11-25