腾讯面试题-1(转载-答案自己找的)

在网上找到了一份腾讯php的面试题,一下是我根据题目自己回答或者上网找到的答案:
1.合并两个数组有几种方式,试比较它们的异同
(1)array_merge():最常用的方式,直接合并,索引数组索引会直接递增,但是遇到关联数组且索引相同的时候会覆盖;
(2)”+”:直接使用”+”号,例如 a+ a + b;,但是加号会用前面出现过的值覆盖后面相同的key;;例如以下代码:

<?php
    $a = array(3,4,"color"=>"red","smell"=>"bitter");
    $b = array(6,7,"color"=>"green","goods"=>"apple");
    print_r($a+$b);
?>

运行的结果如下:

Array ( [0] => 3 [1] => 4 [color] => red [smell] => bitter [goods] =>
apple )

(3)array_merge_recursive():不会产生覆盖的情况,字符串索引数组索引相同的增加数组维度将值放入,数字索引数组会直接增加索引值,刚才的代码执行后的结果会如下:

Array ( [0] => 3 [1] => 4 [color] => Array ( [0] => red [1] => green )
[smell] => bitter [2] => 6 [3] => 7 [goods] => apple )

2 请写一个函数来检查用户提交的数据是否为整数(不区分数据类型,可以是二进制,八进制,十进制,十六进制)
一看到这个题目我脑海里的第一个想法就是is_numeric()和is_int(),实际上这两个方法很简单,但是只能判定十进制的整型,当然,二进制和八进制
(1)php接受键盘输入:测试输入的是否为整数那么必须得用到键盘输入了,以下是我写的代码:

<?php
    fwrite(STDOUT, "请输入数据:");
    $name = trim(fgets(STDIN));
    if (is_numeric($name))
    {
        fwrite(STDOUT, "您输入的是整数");
    }
    else
    {
        fwrite(STDOUT, "您输入的不是整数");
    }
?>

本来之前我是用的is_int()来进行判定的,但是我发现因为使用了输入流,会直接判定为字符串,因此不能使用is_int(),但是使用is_numeric()是没有问题的,但是,这只是十进制下的整数判定,如果是二进制十六进制这些判定是失效的;这里我能想到的办法就是进制转化,关于进制转换我在网上找到了一篇博客,地址如下:
https://www.cnblogs.com/itchang/p/5780002.html
二进制可以直接用is_numeric()判定,同理八进制和十进制都是可以直接判定,关键是十六进制的转换问题。使用base_convert()将十六进制转化为十进制,以下代码是我根据之前的思路得出的新的方法:

<?php
    fwrite(STDOUT, "请输入数据:");
    $name = trim(fgets(STDIN));
    if (is_numeric($name))
    {
        fwrite(STDOUT, "您输入的是整数");
    }
    else
    {
        if(is_numeric(base_convert($name, 16, 10)))
        {
            fwrite(STDOUT, "您输入的是十六进制整数".base_convert($name, 16, 10));
        }
        else
        {
            fwrite(STDOUT, "您输入的不是整数");
        }
    }
?>

但是经测试发现,类似于”aassd”这种也会被判断为十六进制数,这是错误的,因此我决定使用最原始的方法——正则表达式。判断一个数是否为十六进制数的正则表达式是”0[xX][a-fA-F]{1,}”,因此改进如下:

<?php
    fwrite(STDOUT, "请输入数据:");
    $name = trim(fgets(STDIN));
    if (is_numeric($name))
    {
        fwrite(STDOUT, "您输入的是整数");
    }
    else
    {
        if(preg_match('/^0[xX][a-fA-F]{1,}/', $name))
        {
            fwrite(STDOUT, "您输入的是十六进制整数,转化为十进制为:".base_convert($name, 16, 10));
        }
        else
        {
            fwrite(STDOUT, "您输入的不是整数");
        }
    }
?>

经测试,十六进制数也可以判断成功;
3.PHP的strtolower()和strtoupper()函数在安装非中文系统的服务器下可能会导致将汉字转换为乱码,请写两个替代的函数实现兼容Unicode文字的字符串大小写转换
一个汉字可能不止使用一个码来编译,这里需要注意的是不要使用trim()方法,之前使用是没有问题的,因为本身不能输入中文,但是在这里使用trim()中文会被直接过滤掉;以下是在网上找到的解决办法:

<?php

    function mystrtoupper($a){
    $b = str_split($a, 1);
    $r = '';
    foreach($b as $v){
        $v = ord($v);//对该字符转成acsii码
        if($v >= 97 && $v<= 122){//判断是否为小写字母
            $v -= 32;//转换成大写字母
        }
        $r .= chr($v);//将ascii码再转为相应的字符。
    }
    return $r;
}
    // fwrite(STDOUT, "请输入数据:");
    // $name = fgets(STDIN);
    $name = "mdasodas花花沙发jij湖";
    $up = mystrtoupper($name);
    $low = mb_strtolower($name);
    fwrite(STDOUT, "strtoupper结果是:".$up);
    fwrite(STDOUT, "strtolower结果是:".$low);
?>

解析:str_split($a,1)将字符串按照每个字节切割,判断是否为小写字母,是小写字母就转化成大写;同理,如果是大写要转化成小写也可以这么写;ord()将切割完的每个字符转化成ascii码,判断并转化之后用chr()转化成相应的字符并拼接起来。这里有一个知识点就是大写字母和小写字母的ascii码范围,A-Z的范围是65-90,a-z的范围是97-122,小写字母和大写字母之间的ascii码差距是32。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值