PHP常见字符串面试题总结

实现字符串的翻转

// 系统函数
strrev();
// 自定义函数
$str = "123qwer";
$len = strlen($str);
$newStr = '';
for($i=$len;$i>=0;$i--) {
        $newStr .= mb_substr($str,$i,1,'utf-8');
}
echo $newStr;

获取客户端和服务端的ip地址

echo $_SERVER['REMOTE_ADDR'];//客户端IP
echo $_SERVER['SERVER_ADDR'];//服务器端IP
echo $_SERVER['PHP_SELF'];//结果:"/index.php"
//当前脚本的名称(不包括路径和查询字符串)
echo $_SERVER["HTTP_REFERER"];//链接到当前页面的来源url
echo gethostbyname("www.v1pin.com");//获取指定域名的IP地址
echo getenv("REMOTE_ADDR");//获取客户端IP地址
echo getenv("SERVER_ADDR");//获取服务器端IP地址

如何不通过第三个变量交换两个变量的值

$a = 10;
$b = 20;
$array = [$a, $b];
// list($var1, $var2....) = $array;
//将数组的值复制给一组变量,该数组只能为索引并且数组索引0开头
list($b,$a) = $array;
echo $b,$a;
$a = $a+$b;
//只适用于数据不适用于字符串的变量
$a = ($a+$b)-$b;
$b = ($a+$b)-$b;
//将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。
$a = $a^$b;
echo $a;
$b = $b^$a;
echo $b;
$a = $a^$b;
echo $a;
echo "<hr/>";
echo $a,$b;

数组和字符串如何实现相互转换

// 字符串转数组
// explode('分隔符', 字符串);将字符串按照分隔符组装为一个数组
$string = "我,爱,她,!";
var_dump(explode(',', $string));
// 数组转字符串
// implode('分隔符', 数组);将数组按照指定的分隔符拆分为一字符串
$array = ['name' => '张三','age' => 12];
echo implode(',', $array);
// str_split(字符串, 长度);
// 将字符串按照指定的长度分割为数组,字符串中空格也占位
$str = "hello, world !";
var_dump(str_split($str, 2));

字符串替换

// str_replace($findStr, $replaceStr, $str, $count);区分大小写
// str_ireplace($findStr, $replaceStr, $str, $count);不区分大小写
$string = 'hello,world!';
echo str_replace('O', '1', $string);

字符串截取

// mb_substr();可以处理中文编码问题
$string = "我爱你中国!";
echo mb_substr($string, 3, 2, 'UTF-8');
// strstr() 是根据特定字符开始截取指定长度
$strStr = 'hello,world';
strstr($strStr, 'o', true);
// substr() 是根据特定长度截取指定长度
$subStr ='hello,world';
echo substr($subStr, -2, 4);

如何将一个字符串转换为驼峰命名的方式

// ucfirst($str);将字符串的第一个字母转换为大写
// lcfirst($str);将字符串的第一个字母转换为小写
// ucwords($str, flag);将字符按照固定格式分割为一个单词,每个单词的首字母大写
$str2 = "high-school-student-informantion-management-system";
// 方式一
$arr = explode('-', $str2);
$len = count($arr);
$newStr = '';
for ($i=0; $i <$len; $i++) {
    $newStr .= ucfirst($arr[$i]);
}
echo lcfirst($newStr);
// 方式二
$str3 = ucwords($str2, '-');
echo str_replace('-', '', lcfirst($str3));

统计字符串出现频率

$str = substr_count("hello, world!", 'o');
echo $str;

比较两个字符串是否相等

// strcmp($var1, $var2);比较两个变量的大小
// > 返回 <0,< 返回 > 0,= 返回 0
// strcmp($var1, $var2);函数不区分大小写
$var1 = "Hello";
$var2 = "Hello";
if (strcmp($var1, $var2) != 0) {
    echo "两个字符串不相等";
} else {
    echo strcmp($var1, $var2);
}

写一个函数,将一个字符串(如:1234567890),转换成(如1,234,567,890)每3位用逗号隔开的形式

$str = "12345678932132";
function strFormat($str)
{
    $n = "";   //临时的变量
    $m = strlen($str); //获取字符串长度
    $k = $m %  3;  //让整个长度和3取余之后余数是多少 = 0
    for ($i=0; $i < $m; $i++) {
        if ($i%3 == $k && $i!=0) {
            $n .=",";
        }
        $n .= $str{$i};
    }
    return $n;
}
echo strFormat($str);

如何获取一个文件的扩展名

pathinfo()函数,返回文件路径名称、文件名称、扩展名称
// 方式一:利用系统函数操作
$fileInfo = __DIR__ ."/php_function.php";
// 扩展名
echo((pathinfo($fileInfo))['extension']);
// 路径名
echo((pathinfo($fileInfo))['dirname']);
// 文件名
echo((pathinfo($fileInfo))['basename']);
echo "<hr/>";
// 方式二:自定义函数操作
function extname($url)
{
    if (strstr($url, "?")) {
        //如果有问号格式的文件, 将问号前的文件取出给变量$file
        list($file) = explode("?", $url);
    } else {
        $file = $url;
    }
    //以下是第二步取出文件名
    $loc = strrpos($file, "/")+1;
    $filename = substr($file, $loc);
    //以下是第三步取扩展名称
    $arr = explode(".", $filename);
    //弹出数组最后一个元素
    return array_pop($arr);
}
echo extname("http://***/aaa/init.inc.php")."<br>";
echo extname("init.inc.php")."<br>";
echo extname("C:/aaa/init.inc.php")."<br>";
echo extname("http://***/aaa/init.inc.php?a=100")."<br>";
echo "<hr/>获取文件路径名称";
$str = "http://***/aaa/init.inc.php?a=100";
echo mb_substr($str, 0, strripos($str, '/'));
echo "<hr/>获取文件名称";
$str = "http://***/aaa/init.inc.php?a=100";
echo (explode('?', mb_substr($str, strripos($str, '/'))))[0];

写一个函数,算出两个文件的相对路径

function abspath($a, $b)
{
    //第一步去除公共的目录结构
    //  $a = "/a/b/c/d/e.php";
    //  $b = "/a/b/12/34/c.php";
    $a = dirname($a);    //  /a/b/c/d
    $b = dirname($b);    //  /a/b/12/34
    $a = trim($a, "/");   //   a/b/c/d
    $b = trim($b, "/");   //   a/b/12/34
    $a = explode("/", $a);  //  array("a", "b", "c", "d")
    $b = explode("/", $b);  //  array("a", "b", "12", "34")
    //合并上面代码相当于 $a = explode("/", trim(dirname($a), "/"));
    $num = max(count($a), count($b));
    for ($i=0; $i<$num; $i++) {
        if ($a[$i]==$b[$i]) {
            unset($a[$i]);
            unset($b[$i]);
        } else {
            break;
        }
    }
    //$a = array("c", "d");
    //$b = array("12", "34");
    //第二步:回到同级目录, 进入另一个目录
    $path = str_repeat("../", count($b)).implode("/", $a);    //  ../../c/d
    return $path;
}
$a = "/a/b/c/d/e/w/f/e.php";
$b = "/a/b/12/34/100/c.php";
// ../../c/d
echo abspath($a, $b);

由于此类问文章首发地址为该微信公众号,后期会不断更新,微信公众号不便于更新,可以点击左下角的阅读原文按钮,即可查看最新版本。

原文发布于微信公众号 - 浪子编程走四方(qq1005349393)

原文发表时间:2018-12-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券