+ -
当前位置:首页 → 问答吧 → PHP 自定义函数实现系统函数功能

PHP 自定义函数实现系统函数功能

时间:2010-01-17

来源:互联网

总是用别人写好的函数 是不是觉得不爽?好,下面跟着我来写吧~~以下代码全部由自己编写,绝无抄袭之嫌~~现贴上,仅供参考.(可能有些功能没有写全)
说明一下,写系统函数再拿来使用确实很蠢,但只是作为练习,还有,在面试时确实是算法考得多,网上找来的面试题也大都要靠算法\语法熟练才能完成~~!

1,自定义函数实现strlen()函数的功能,该函数返回一个字符串的长度;
function my_strlen2($str){
if (!is_string($str)){
  return false;
 }
for ($i=0;($str{$i}) !=="";$i++);
  return $i;
}

2,自定义函数实现strrev()函数功能,该函数把一段字符串倒过来输出(即字符串反转);
function my_strrev($str){
  $cut = '';
  for ($i = 0; $str{$i}!==''; $i++){
  $cut = $str{$i}.$cut;
  }
  return $cut;
}
更简单的方法:
function myStrlen($str){
 for ($i=0; $str[$i]!==''; $i++);
 return $i;
}
for ($i=myStrlen($str); $i>-1; $i--){
 $res .= $str[$i];
}
echo $res;

3.自定义函数实现count()函数功能,该函数返回数组中元素的个数;
function my_count($arr){
if (!is_array($arr)){
  return false;
}
$i = 0;
while ($arr{$i}){
  $i++;
}
  return $i;
}

4.冒泡排序法;
function my_sort($arr){
 $len = count($arr);
 for ($i=0; $i<$len-1; $i++){
  for ($j=$i; $j<$len; $j++){
   if ($arr[$i] > $arr[$j]){
    $res     = $arr[$i];
    $arr[$i] = $arr[$j];
    $arr[$j] = $res;
   }
  }
 }
 return $arr;
}

5.自定义函数实现strpos()函数功能,该函数返回一个字符在字符串中的位置;
function my_strpos($str1,$str2){
 if (!is_string($str1) || !is_string($str2)){
  return false;
 }
 $i = 0;
 while (($res = $str1{$i}) !== ""){
  $i++;
  if ($res === $str2){
   return $i-1;
  }
 }
 return false;
}

6.自定义函数实现strstr()函数功能,该函数截取指字符串后面的字符;
function my_strstr2($str1,$str2){
 if (!is_string($str1) || !is_string($str2)){
  return false;
 }
 for ($i=0;($res=$str1{$i}) !== "";$i++){
  if ($res === $str2){
   for ($j=$i;($res=$str1{$j}) !=="";$j++){
    echo $res;
   }
   break;
  }
 }
}

7.试完成一个程序,它统计自然数1到1000000中,至少有一位数为7(例如,307)的数字个数。
function myStrpos($str,$num){  //检测字符串是否存在某个值,如存在返回 true, 否则为 false
 if (!is_string($str)){   //判断接受的数据是否为 string 型,如果不是则进行强制转换
  settype($str,"string");
 }
 for ($i=0; ($res=$str[$i])!=='';$i++){
  if ($res === $num)
   return true;
 }
 return false;
}
for($num=1; $num<1000; $num++){  //考虑到系统资源,只用1000做测试;
    if(myStrpos($num, '7') !== false){
  $arr[] = $num;
    }
}

8.自定义函数实现array_diff()功能该函数返回两个数组的差集部分(返回数组1中有但数组2中没有的元素),保持键名不变
function my_in_array($str,$arr){   //自定义 in_array() 函数,备用
 foreach ($arr as $val){
  if ($str === $val){
   return true;
  }
 }
 return false;
}
function my_array_diff($arr1,$arr2){
 $arr = array();
 foreach ($arr1 as $key=>$val1){
  if (!my_in_array($val1,$arr2)){
   $arr[$key]  = $val1;   //保持键名不变
  }
 }
 return $arr;
}
$arr1 = array("a" => "green", "red", "color"=>"blue", "fruit"=>"apple");
$arr2 = array("b" => "green", "yellow", "red");
print_r (my_array_diff($arr1,$arr2));  //测试函数功能

9.自定义函数实现array_fill()功能该函数用给定的值填充数组,
function my_array_fill2($num1,$num2,$str){
 $arr = array();
 for ($i=1; $i<=$num2; $i++){
  $arr[] = $str;
  foreach ($arr as $key=>$val){
   $arr[$key] = $key+$num1;
  }
  foreach ($arr as $key=>$val){
   $key = $str;
   $arr2[$val] = $key;
  }
 }
 return $arr2;
}
print_r (my_array_fill2(2,6,"hello"));

10.自定义函数实现str_split()功能该函数把一段字符串切割到一个数组中,默认值的长度为1
function my_str_split($str,$num){
 for ($i=0;($str{$i})!=='';$i++){
  $result[] = $str{$i};   //遍历字符串,把每一次截取到的字符放入数组中
  if (isset($num)){    //如果设定了变量,则执行下面的操作
   for ($i=0;($cha=$str{$i})!=='';$i++){
    //$cut = floor($i/$num);  //舍去法取整
    $cut = (int)$i/$num; //或者强制转成整型
    $result2{$cut}.=$cha;
   }
   return $result2;
  }
 }
 return $result;
}
$str = "good morning sir!";
print_r (my_str_split($str,3));

今天继续贴一些:

11. 自定义函数实现http_build_query()功能,该函数生成 URL-encode 之后的请求字符串
function my_http_build_query($arr){
 $bool = true;
 foreach ($arr as $key=>$val){
  if ($bool){
   $res .= $key.'='.$val;
   $bool = false;
  } else {
   $res .= '&'.$key.'='.$val;
  }
 }
 for ($i=0;($cut=$res{$i})!=='';$i++){ //遍历字符串
  if ($cut === ' '){     //如果字符串中某个位置为空
   $res{$i} = '+';     //就用+号替换它,相当于str_replace函数
  }
 }
 return $res;
}
$arr = array('foo','bar','third'=>'baz','boom','cow'=>'milk','php'=>'hypertext processor');
echo my_http_build_query($arr);echo '<br/>';
echo http_build_query($arr);

12. 自定义函数实现str_replace()功能,该函数把字符串的某些值替换成指定值
function my_str_replace($arr, $str1, $str2){
 foreach ($arr as $val){
  for ($i=0; ($cut=$str2{$i})!==''; $i++){
   if ($cut === $val){
    $str2{$i} = $str1;
   }
  }
 }
 return $str2;
}
$arr = array("e","P","I","H");
$str2 = "Hello World of PHP, I'm at home now!";
echo my_str_replace($arr,"-",$str2); //测试函数

13. 面试题
<?php
/*
1.(获取字母组合)
题目要求:
做一个三位字母的组合功能。型如“abd,ade,acc,aef等等”;
目标:
1)字母的所有组合需要打印出来
2)字母组合要排除。abc(三个字母顺连续),cba(三个字母倒连续) ,aaa(三个字母相同)的情况
3)最后结果需要计算出 abc情况的数量,cba情况的数量,aaa情况的数量,以及打印出来正确字母组合的数量。
*/
/*
思路:
一,可利用字母所对应的ACSII码进行操作
 字母A-Z对应ACSII码:97-122
二,自用PHP chr()函数对字母进行ASCII-->字母转换
三,用for循环对字母的ASCII码进行组合排列
*/
/*
结果:
该程序基本实现了题目要求,下面是处理结果:
1) 所有字母组合的数量为:  17576;
2) 三个字母相同组合的数量为: 26;
3) 三个字母正连续组合的数量为 24;
4) 三个字母倒连续组合的数量为:  24;
5) 正确字母组合的数量为:   17502;
其他: 于题意,程序未实现打印除上述组合的组合,只是求得了它的结果数量.
*/
function my_test(){      //1)计算出所有字母组合
 for ($i=97;$i<=122;$i++){
  for ($j=97;$j<=122;$j++){
   for ($k=97;$k<=122;$k++){
    $arr[] = chr($i).chr($j).chr($k);
   }
  }
 }
 return $arr;
}
$res = my_test();
echo count($res);      //所有字母组合的数量
echo '<br/>';
for ($l=97;$l<=122;$l++){
 foreach ($res as $value){
  if ($value === chr($l).chr($l).chr($l)){    //2) 计算出三连续组合
   $res1[]  = $value;
  }
  elseif ($value === chr($l).chr($l+1).chr($l+2)){  //3) 计算出正连续组合
   $res2[]  = $value;
  }
  elseif ($value === chr($l).chr($l-1).chr($l-2)){  //4) 计算出倒连续组合
   $res3[]  = $value;
  }
 }
}
print_r (count($res1));echo '<br/>'; //三连续组合的数量
print_r (count($res2));echo '<br/>'; //正连续组合的数量
print_r (count($res3));echo '<br/>'; //倒连续组合的数量
$exp = count($res)-count($res1)-count($res2)-count($res3);  //计算正确字母组合的数量
echo $exp;
[ 此帖被location在2010-01-17 23:00重新编辑 ]

作者: location   发布时间: 2010-01-17

好,顶了!

作者: singletiger   发布时间: 2010-01-17

不错,我这也有一些,就是不知道放哪了,很久以前写的,改天我找到了再贴上

作者: xiaobo   发布时间: 2010-01-17

没多大意义,只能说明你比较熟悉语法。要用的话,还是得用系统函数。比自己写的运行速度要快,还减少代码量

作者: zhushide   发布时间: 2010-01-17

不管怎样,感谢分享!!!好样的!

作者: xzzx_lt   发布时间: 2010-01-19

热门下载

更多