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

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

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

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值