在网上找到了一份腾讯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。