您的位置:首页 > 编程语言 > PHP开发

PHP笔试(持续更新...)

2017-09-24 22:10 357 查看

笔试易入雷区

基础篇

1.写出如下程序的输出结果

<?php
$test = ‘aaaaaa’;
$abc = & $test;
unset($test);
echo $abc;


输出结果是“aaaaaa”分析如下:

首先PHP内置有一种规则是:当有两个变量同时指向一个内存地址时,这时若其中一个被销毁,但另一个仍然指向该地址。那么内存中存放的数据不会被回收机制处理。因此仍然输入aaaaaa。

网上别人的理解:

因为变量abc引用的是指向aaaaa的路径,而不是引用变量text本身。就好比路径是钥匙的话。现在$abc是配的钥匙, aaaaaa是门后面的内容。现在你毁坏了原装的钥匙,但是门后面的内容,和配的钥匙是不变的。因为还有变量指向aaaaaa,所以aaaaaa也不会被php回收机制销毁。

2.写出如下程序的输出结果

<?php
$count = 5;
function get_count(){
static $count = 0;
return $count++;
}
echo $count;
echo get_count();
echo get_count();
?>


上方代码答案是:5 0 1 。重点分析后两个:由于在函数内定义的是静态变量count,因此每次函数结束之后仍能保持原来的值。又由于是return $count++,所以第一次返回的是0,之后再在之前的基础上加一。

3.$GLOBALS[‘a’]与global ¥a的区别

<?php
$GLOBALS['var1']=5;
$var2=1;
function get_value(){
global $var2;
$var1 = 0;
return $var2++;
}
get_value();
echo $var1;
echo $var2;
?>


<?php
$var1 = 1;
$var2 = 2;

function test(){
global $var1, $var2;
$var2 = &$var1;
echo $var2;
$var2 = 'snsgou.com';
}

test(); // 输出 1
echo $var2; // 输出 2
echo $var1; // 输出 snsgou.com
?>


附上参考链接:有关上述两者的区别

4.下面输出结果是多少?

$arr = array(0=>1,"aa"=>2, 3, 4);
foreach($arr as $key=>$val){
print($key == "aa" ? 5 : $val);
}


结果:5534

解析:遍历每一个元素的key看等不等于aa,等于就用5替代。当我告诉你答案是5534的时候,你会不会有点惊讶!难道0等于”aa”吗?是的,0就等于”aa”,这道题重点就考你这个。在PHP中两个值进行逻辑判断时,如果两个值的类型不一致PHP会自动把右边的值转换到左边的类型,然后再进行判断。因此”aa”转换整形等于0,自然也就等于左边的0了。

5.请指出下面结果

$a = 3;
$b = 5;
if($a = 5 || $b = 7) {
$a++;
$b++;
}
echo $a . " " . $b;


结果:1 6

解析:执行结果是多少?如果你回答 6 8 or 4 6 or 6 6,那你就掉入陷阱了。

第一个陷阱,认为答案等于 4 6 。估计你粗心把 a=5||b = 7 看成 a==5||b == 7 ,这是新手常犯的错误。

第二个陷阱,认为答案等于 6 8。 你识破了 a=5||b = 7 这个骗局,但你没有注意到,逻辑或里只要依次执行直到某个表达式结果为true,表达式后边的就不再执行,a=5返回true,后边的b=7就不执行了。

第三个陷阱,认为答案等于 6 6。 OK,你识破了 逻辑或的规则,于是a=5执行,b=7不执行,但是你没有考虑到这里是逻辑表达式,返回给a的值是要转换为布尔值的。这样看。所以经过以上三个陷阱,你应该知道答案是多少了,其实a等于true以后,echo a输出就是1,b值不变,结果就是 1 6 。

6.输出结果

$a = count ("567")  + count(null) + count(false);
echo $a;


结果:2

解析:如果你回答 3 or 1,恭喜,掉入陷阱了。

因为count(null)等于0,false也算一个值。所以count(false)等于1。

算法篇

二、算法题

1. 使用 PHP 描述冒泡排序和快速排序算法,对象可以是一个数组

//冒泡排序(数组排序)

function bubble_sort($array)
{
$count = count($array);
if ($count <= 0) return false;
for($i=0; $i<$count; $i++){
for($j=$count-1; $j>$i; $j–){
if ($array[$j] < $array[$j-1]){
$tmp = $array[$j];
$array[$j] = $array[$j-1];
$array[$j-1] = $tmp;
}
}
}
return $array;
}


//快速排序(数组排序)

function quick_sort($array) {
if (count($array) <= 1) return $array;
$key = $array[0];
$left_arr = array();
$right_arr = array();
for ($i=1; $i<count($array); $i++){
if ($array[$i] <= $key)
$left_arr[] = $array[$i];
else
$right_arr[] = $array[$i];
}
$left_arr = quick_sort($left_arr);
$right_arr = quick_sort($right_arr);
return array_merge($left_arr, array($key), $right_arr);
}


2 .使用 PHP 描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,

对象可以是一个有序数组

//二分查找(数组里查找某个元素)

function bin_sch($array, $low, $high, $k){
if ($low <= $high){
$mid = intval(($low+$high)/2);
if ($array[$mid] == $k){
return $mid;
}elseif ($k < $array[$mid]){
return bin_sch($array, $low, $mid-1, $k);
}else{
return bin_sch($array, $mid+1, $high, $k);
}
}
return -1;
}


//顺序查找(数组里查找某个元素)

function seq_sch($array, $n, $k){
$array[$n] = $k;
for($i=0; $i<$n; $i++){
if($array[$i]==$k){
break;
}
}
if ($i<$n){
return $i;
}else{
return -1;
}
}


3 . 写一个二维数组排序算法函数,能够具有通用性,可以调用 php 内置函数

//二维数组排序, arr是数据,keys 是排序的健值,$order 是排序规则,1 是升序,0是降序

function array_sort($arr, $keys, $order=0) {
if (!is_array($arr)) {
return false;
}
$keysvalue = array();
foreach($arr as $key => $val) {
$keysvalue[$key] = $val[$keys];
}
if($order == 0){
asort($keysvalue);
}else {
arsort($keysvalue);
}
reset($keysvalue);
foreach($keysvalue as $key => $vals) {
$keysort[$key] = $key;
}
$new_array = array();
foreach($keysort as $key => $val) {
$new_array[$key] = $arr[$val];
}
return $new_array;
}


都是基本又常见的算法题,好好看,好好练。

今天在刷题时发现了一个小坑,不小心就会栽进去。

当我们用echo指令输出布尔类型时,如果是true则输出的是1,false则什么也不输出。我们可以使用var_dump函数,获取它真正的数据类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: