乐趣区

PHP的一些基础编程题

前言

对 PHP 的一些编程基础题做了个整理,时常做这样的题目可以巩固下自己的基础,锻炼下逻辑思维能力,面试笔试的时候有可能也用得到。整理的这些题目中笔者就曾在笔试中遇到过,对于面试官为何出这样的题目,我觉得主要是想考察你的这几个方面能力:
1、PHP 基础是否扎实;
2、是否能用文本编辑器编写代码;
3、命名是否规范,代码逻辑和书写风格是否可取;
4、面对问题,解决问题的能力;

编程题

1、获取 img 图片路径

$str="<img src='1.jpg'/><img src='2.jpg'/>";
$match="/<img.*?src=[\'\"](.*?)[\'\"].*?/";
preg_match_all($match,$str,$arr);
print_r($arr[1]);
        
输出结果:Array ([0] => 1.jpg [1] => 2.jpg )

2、输出评星倒三角形状

$num=5;// 最大评星数量
$begin=$end=array();$star='*';$brank='';
for($a=0;$a<$num;$a++){$begin[$a]=$star;
    $star.='*';
}
rsort($begin);
for($b=0;$b<count($begin);$b++){$end[$b]=$brank.$begin[$b];
    $brank.='&nbsp;';
}
var_export($end);

输出结果:array (
  0 => '*****',
  1 => '&nbsp;****',
  2 => '&nbsp;&nbsp;***',
  3 => '&nbsp;&nbsp;&nbsp;**',
  4 => '&nbsp;&nbsp;&nbsp;&nbsp;*',
)

3、计算出 $b 相对于 $a 的相路径

 $a = '/a/b/c/d/a.php';
 $b = '/a/b/12/34/c.php';

 $a=explode('/',$a);
 $b=explode('/',$b);
 $path='';

 // 将除掉 a 路径的文件名
 array_pop($a);
 
 // 获取 $a,$b 数组中重复的值
 $ab=array_merge($a,$b);
 $c=array_filter(array_diff_assoc($ab,array_unique($ab)));

 // 将 b 个数组的索引重置
 $d=array_values(array_diff($b,$a));

 // 将 a 路径中的目录替换为..
 foreach($c as &$v) $v='..';

// 合并两个数组
 $e=array_merge($c,$d);
// 拼接路径
foreach($e as &$v) $path.=$v.'/';

$path=rtrim($path,'/'); 
var_export($path);

输出结果:'../../12/34/c.php'

4、2 的 1000 次方计算逻辑

$total=2;
for($i=2;$i<=1000;$i++){$total=$total*2;}
$total=number_format($total,0,'','');
print_r($total);

输出结果:1071508607186267320948425049060001810561404811...

5、写出程序执行的结果

$x=5;
echo ++$x;//6
echo '<br />';
echo $x++ + ++$x;//6+8=14 // 后 ++ 不参与运算不加 1,前 ++ 参与运算并加 1;echo '<br />';
echo $x-- + --$x;//8+6=14 // 后 -- 不参与运算不减 1,前 -- 参与运算并减 1;echo '<br />';
echo $x;//6

输出结果:6
14
14
6

6、获取 url 中文件的扩展名,需要取出 php 或.php

$url='http://www.ceshi.com/osfipin/osfipin.php?id=1';
$arr = explode('.',explode('?',$url)[0]);
echo end($arr);//php
//echo '<br />';
//echo key($arr);// 获取最后一个元素的键值 输出 '3'
//echo '<br />';
//echo current($arr); //http://www
//echo '<br />';
//echo next($arr); //ceshi
//echo '<br />'; 
//echo prev($arr); //http://www 

输出结果:php

7、自定义千位分隔符函数

function numberFormat($x)
{ 
 // 获取分割的数的总长度
 $len=strlen($x);
 $j=0;
 $val1=$val2='';
 // 从千位数开始循环
 for($i=3;$i<=$len;$i++){
  // 能被 3 整除,就从这个位置反向截取 3 个字符
  if($i%3==0){
   // 将字符截取,并在前面拼接上 "," 号
   $val1=','.substr($x,'-'.$i,3);
   // 把新截取的字符拼接到原来截取字符的前面
   $val2=$val1.$val2;
   // 记录最后一个能被 3 整除的位置
   $j=$i;
  }
 }
 // 用分割的数的总长度减去最后一个能被 3 整除的位置作为长度,从 0 开始截取字符串,得到余下不够千位分割符的数
// 然后将其拼接到已经千位分割好的数 $val2 前面,// 再把左边多余的 "," 号去掉即可
 $val3=substr($x,0,$len-$j);
 if($val3) $val2=$val3.$val2;
 $val2=ltrim($val2,',');
 return $val2;
}
$x=1234567890;// 需要分割的数
$x=numberFormat($x);// 调用自定义分割函数
print_r($x);

输出结果:1,234,567,890

8、自定义一个函数,可在多次重复调用的情况下使他输出 A B C 的比例分别是 5:3:1

function abc()
{ 
  echo 'AAAAA';
  echo 'BBB';
  echo 'C';
}
for($i=0;$i<2;$i++){abc();
}

输出结果:AAAAABBBCAAAAABBBC

分析总结

以上这些题目只是本人给出的一种答案,可能存在多种解题思路,如果有朋友想到其他思路可以在留言区留言,附上题号,解题思路和代码,不限语言。

退出移动版