wangyongdong
9/19/2019 - 7:03 AM

php一些函数题目

/**
 * 请写一个函数,实现以下功能:
 * 字符串“open_door” 转换成 “OpenDoor”、”make_by_id” 转换成 ”MakeById”。
 */
function strConver(string $string) {
    $array = explode("_", $string);
    $string = '';
    foreach ($array as $str) {
        $string .= ucfirst($str);
    }
    return str_replace("_", "", $string);
}
echo strConver('make_by_id');

/**
 * 请写一个函数将1234567890转换成1,234,567,890 每3位用逗号隔开的形式
 */
function numberConver(int $number) {
    //反转
    $number = strrev($number);
    $str = '';
    for ($i=0; $i<strlen($number); $i++) {
        $str .= $number[$i];
        if($i != 0 && ($i+1)%3 == 0) {
            $str .= ',';
        }
    }
    return strrev($str);
}
$number = 1234567890;
echo numberConver($number);

/**
 * 请用php将中读取出的网页内容的<title>标签的值解析出来。
 */
$regex ="/<title>(.*)<\/title>/";
$result = array();
preg_match($regex, $str,$result);
echo trim($result[0],"<title></title>");

/**
 * 用最少的代码写一个求3个值最大值的函数.
 */
echo '<hr/>';
$a = 8; $b = 33; $c = 2;
// 1
echo max($a, $b, $c);
// 2
echo ($a ? $b : $a) > $c ? ($a ? $b : $a ) : $c;

/**
 * PHP可阅读随机字符串
 * 此代码将创建一个可阅读的字符串,使其更接近词典中的单词,实用且具有密码验证功能。
 * @param int $length
 * @return string
 */
function readable_random_string($length = 6) {
    $conso = array("b","c","d","f","g","h","j","k","l","m","n","p","r","s","t","v","w","x","y","z");
    $vocal = array("a","e","i","o","u");
    $password="";
    srand ((double)microtime()*1000000);
    $max = $length/2;
    for($i=1; $i<=$max; $i++) {
        $password.=$conso[rand(0,19)];
        $password.=$vocal[rand(0,4)];
    }
    return $password;
}
echo readable_random_string() . '<br/>';

/**
 * PHP编码电子邮件地址
 * 使用此代码,可以将任何电子邮件地址编码为 html 字符实体,以防止被垃圾邮件程序收集。
 * @param string $email
 * @param string $linkText
 * @param string $attrs
 * @return string
 */
function encode_email($email='info@domain.com', $linkText='Contact Us', $attrs ='class="emailencoder"') {
    $email = str_replace('@','&#64;',$email);
    $email = str_replace('.','&#46;',$email);
    $email = str_split($email,5);
    $linkText = str_replace('@','&#64;',$linkText);
    $linkText = str_replace('.','&#46;',$linkText);
    $linkText = str_split($linkText,5);
    $part1 = '<a href="ma';
    $part2 = 'ilto&#58;';
    $part3 = '" '. $attrs .' >';
    $part4 = '</a>';
    $encoded = '<script type="text/javascript">';
    $encoded .= "document.write('$part1');";
    $encoded .= "document.write('$part2');";
    foreach($email as $e) {
        $encoded .= "document.write('$e');";
    }
    $encoded .= "document.write('$part3');";
    foreach($linkText as $l) {
        $encoded .= "document.write('$l');";
    }
    $encoded .= "document.write('$part4');";
    $encoded .= '</script>';
    return $encoded;
}
echo encode_email() . '<br/>';

/**
 * PHP强制性下载文件
 * @param $file
 */
function force_download($file) {
    if ((isset($file)) && (file_exists($file))) {
        header("Content-length: ".filesize($file));
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="' . $file . '"');
        readfile("$file");
    } else {
        echo "No file selected<br/>";
    }
}
force_download("index.php1");

/**
 * PHP为 URL 地址预设 http 字符串
 * @param $url
 * @param bool $https
 * @return string
 */
function addhttp($url, $https = true) {
    $prefix = 'http://';
    if (!preg_match("/^(http|ftp|https):/", $url)) {
        if($https) {
            $prefix = 'https://';
        }
        $url = $prefix . $url;
    }
    return $url;
}
echo addhttp("www.baidu.com", true) . '<br/>';

/**
 * PHP调整图像尺寸
 * @param $filename
 * @param $tmpname
 * @param $xmax
 * @param $ymax
 * @return resource
 */
function resize_image($filename, $tmpname, $xmax, $ymax) {
    $ext = explode(".", $filename);
    $ext = $ext[count($ext)-1];
    if($ext == "jpg" || $ext == "jpeg") $im = imagecreatefromjpeg($tmpname);
    elseif($ext == "png") $im = imagecreatefrompng($tmpname);
    elseif($ext == "gif") $im = imagecreatefromgif($tmpname);
    $x = imagesx($im);
    $y = imagesy($im);
    if($x <= $xmax && $y <= $ymax) return $im;
    if($x >= $y) {
        $newx = $xmax;
        $newy = $newx * $y / $x;
    } else {
        $newy = $ymax;
        $newx = $x / $y * $newy;
    }
    $im2 = imagecreatetruecolor($newx, $newy);
    imagecopyresized($im2, $im, 0, 0, 0, 0, floor($newx), floor($newy), $x, $y);
    return $im2;
}

/**
 * PHP检测 ajax 请求
 * 大多数的 JavaScript 框架如 jquery,Mootools 等,在发出 Ajax 请求时,都会发送额外的 HTTP_X_REQUESTED_WITH 头部信息,头当他们一个ajax请求,因此你可以在服务器端侦测到 Ajax 请求。
 */
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
    echo "This is ajax<br/>";	//IfAJAX Request Then
} else {
    echo "Is not ajax<br/>";		//something else
}


// 获取url后缀
function get($url) {
    // 解析 URL,返回其组成部分
    // 指定 PHP_URL_SCHEME、 PHP_URL_HOST、 PHP_URL_PORT、 PHP_URL_USER、 PHP_URL_PASS、 PHP_URL_PATH、 PHP_URL_QUERY 或 PHP_URL_FRAGMENT 的其中一个来获取 URL 中指定的部分的 string。
    //
    $php_url_path = parse_url($url,  PHP_URL_PATH);
    // 返回路径中的文件名部分。
    $file = basename($php_url_path);
    // 获取后缀名
    $ext = explode(".", $file);
    return $ext[1];
}
function getexts($url) {
    $url = basename($url);
    // 字符串中第一次出现的位置
    $pos1 = strpos($url, ".");
    // 字符串中第一次出现的位置
    $pos2 = strpos($url, "?");
    if(strstr($url, "?")) {
        return substr($url, $pos1+1,$pos2-$pos1-1);
    } else {
        return substr($url, $pos1);
    }
}
$url = "http://localhost/webtest/phpmst/test.php";
echo get($url)."<br/>";
echo getexts($url)."<br/>";


/**
 * 冒泡
 * @param $arr
 */
$arr = array(11,23,545,667,888,1119,55,98);
function bubblesort($arr) {
	$temp = 0;
	for($i=0;$i<count($arr);$i++) {
		for($j=0;$j<count($arr)-1;$j++) {
			if($arr[$j] > $arr[$j+1]) {
				$temp = $arr[$j];
				$arr[$j] = $arr[$j+1];
				$arr[$j+1] = $temp;
			}
		}
	}
	return $arr;
}
print_r(bubblesort($arr));

/**
 * 写一个函数,算出两个文件的相对路径,计算出 $b 相对于 $a 的相对路径应该是 ../../c/d将()添上
 * @param $a
 * @param $b
 * @return string
 */
function relative_path($path1, $path2) {
    $arr1 = explode('/',dirname($path1));
    $arr2 = explode('/',dirname($path2));
    for($i=0, $len=count($arr2); $i<$len;$i++) {
        if($arr1[$i] != $arr2[$i]) {
            break;
        }
    }
    //不在同一个根目录下
    if($i==1){
        $return_path = array();
    }
    //在同一个根目录下
    if($i!=1 && $i<$len){
        $return_path = array_fill(0,$len-$i,"..");
    }
    //在同一个目录下
    if($i==$len){
        $return_path = array('./');
    }
    $return_path = array_merge($return_path,array_slice($arr1,$i));
    return implode('/',$return_path);
}
$a = '/a/b/c/d/e.php';
$b = '/a/b/12/34/c.php';
$c = '/e/b/c/d/f.php';
$d = '/a/b/c/d/g.php';
echo relative_path($a, $b)."<br/>";
echo relative_path($a,$c)."<br/>";
echo relative_path($a,$d)."<br/>";

/* 在HTML语言中,页面头部的meta标记可以用来输出文件的编码格式,以下是一个标准的meta语句
<META http-equiv='Content-Type' content='text/html'; charset='gbk'>
请使用PHP语言写一个函数,把一个标准HTML页面中的类似 meta 标记中的 charset 部分值改为 big5。

请注意:
(1) 需要处理完整的html页面,即不光此meta语句
(2) 忽略大小写
(3) ‘ 和 ” 在此处是可以互换的
(4) ‘Content-Type’ 两侧的引号是可以忽略的,但 ‘text/html; charset=gbk’ 两侧的不行
(5) 注意处理多余空格

解析:这里全面考察正则表达式匹配。
(1) 需要处理完整的html页面,即不光此 meta 语句  ==> preg_replace()
(2) 忽略大小写 ==> i修饰符
(3) ‘ 和 ” 在此处是可以互换的 ==> 多选结构  ["/']
(4) ‘Content-Type’ 两侧的引号是可以忽略的,但 ‘text/html; charset=gbk’ 两侧的不行 => 可选结构  ’?
(5) 处理多余的空格 \s? 表示0到多处空白

综合,我们得到的测试代码如下:*/

$html = "<meta http-equiv='Content-Type' content='text/html; charset=gbk'>";
//匹配标准的meta标签
$pattern = "/<meta\s*http-equiv\s*=\s*(\'|\")?Content-Type(\'|\")?\s*content\s*=\s*(\'|\")text\/html\s*;\s*charset=(.*)(\'|\")>/i";
$replacement = "<meta http-equiv='Content-Type' content='text/html; charset=big5'>";
$result = preg_replace($pattern, $replacement, $html);
echo htmlspecialchars($result) . '<br/>';

//=====================================================

echo "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'] . '<br/>';//获取网页地址
echo $_SERVER['REMOTE_ADDR'] . '<br/>';//获取IP地址

//字符串“open_door” 转换成 “OpenDoor”、”make_by_id” 转换成 ”MakeById”。
$arr = array_map("ucfirst",
    explode("_","open_door")
);
echo implode($arr,"") . '<br/>';


/**
 * 按字段排序数组
 * @param $arr
 * @param $row
 * @param string $type
 * @return mixed
 */
function array_sort($arr, $row, $type="asc") {
    foreach($arr as $v) {
        $arr_temp[$v[$row]] = $v;
    }
    if($type = "asc") {
        ksort($arr_temp);
    } else {
        krsort($arr_temp);
    }
    return $arr_temp;
}
$person = array(
    array('id' => 2,'name' => 'zhangsan','age' => 23),
    array('id' => 5,'name' => 'lisi','age' => 19),
    array('id' => 3,'name' => 'wangwu','age' => 27)
);
$person = array_sort($person,'name');
var_dump($person);
echo '<br/>';

function array_sort2($arr, $row, $type="SORT_DESC") {
    $sort = array(
        'direction' => $type, 	//排序顺序标志 SORT_DESC 降序;SORT_ASC 升序
        'field'     => $row,    //排序字段
    );
    $arrSort = array();
    foreach($arr AS $uniqid => $row) {
        foreach($row AS $key=>$value) {
            $arrSort[$key][$uniqid] = $value;
        }
    }
    if($sort['direction']) {
        array_multisort($arrSort[$sort['field']], constant($sort['direction']), $arr);
    }
    return $arr;
}
$sArr = array_sort2($person,'name');
var_dump($sArr);
echo '<br/>';


/**
 * 实现strrev()函数“360奇虎”,不使用mb_substr情况下。
 * @param $string
 * @return string
 */
function myStrrev($string) {
    $length = strlen($string);
    $rev_string = '';
    $byte_len = 3;	// 限UTF-8字符编码字节占3,不然还有写个is_utf8来判断所占用的字节数
    for ($i = 0; $i < $length;) {
        // 判断每个字符的 ASCII 值,大于126为汉子,utf-8是三个字节,所以加+
        if(ord(substr($string, $i, 1)) > 126) {
            $rev_string = substr($string, $i, $byte_len) . $rev_string;
            $i+= $byte_len;
        } else {
            $rev_string = substr($string, $i, 1) . $rev_string;
            $i++;
        }
    }
    return $rev_string;
}
$string = "虎奇063";
echo myStrrev($string) . '<br/>';

/**
 * 实现strrev()函数“360奇虎”,不使用mb_substr情况下。
 * @param $str
 * @return string
 */
function strrev_utf8($str) {
    return join("", array_reverse(
        preg_split("//u", $str)
    ));
}
echo strrev_utf8($string) . '<br/>';

/**
 * 获取文件扩展名
 * @param $filename
 * @return mixed
 */
function getExtension($filename){
    $myext = substr($filename, strrpos($filename, '.'));
    return str_replace('.','',$myext);
}
echo getExtension('index.ajax.php');

/**
 * 获取文件大小并格式化
 * @param $size
 * @return string
 */
function formatSize($thefile) {
    $size = filesize($thefile);
    $sizes = array(" Bytes", " KB", " MB", " GB", " TB", " PB", " EB", " ZB", " YB");
    if ($size == 0) {
        return('n/a');
    } else {
        return (round($size/pow(1024, ($i = floor(log($size, 1024)))), 2) . $sizes[$i]);
    }
}
echo formatSize('test_file.mp3');

/**
 * 强制下载文件
 * @param $filename
 */
function download($filename) {
    if ((isset($filename)) && (file_exists($filename))) {
        header("Content-length: ".filesize($filename));
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="' . $filename . '"');
        readfile("$filename");
    } else {
        echo "Looks like file does not exist!";
    }
}

/**
 * 检测访问的ip是否为规定的允许的ip
 */
function check_ip() {
    $ALLOWED_IP = array('192.168.2.*', '127.0.0.1', '192.168.2.49');
    $IP = getIP();
    $check_ip_arr = explode('.', $IP);//要检测的ip拆分成数组
    #限制IP
    if (!in_array($IP, $ALLOWED_IP)) {
        foreach ($ALLOWED_IP as $val) {
            if (strpos($val, '*') !== false) {//发现有*号替代符
                $arr = array();
                $arr = explode('.', $val);
                $bl = true;// 用于记录循环检测中是否有匹配成功的
                for ($i = 0; $i < 4; $i++) {
                    if ($arr[$i] != '*') {//不等于*  就要进来检测,如果为*符号替代符就不检查
                        if ($arr[$i] != $check_ip_arr[$i]) {
                            $bl = false;
                            break;//终止检查本个ip 继续检查下一个ip
                        }
                    }
                }
                if ($bl) {//如果是true则找到有一个匹配成功的就返回
                    return;
                    die;
                }
            }
        }
        header('HTTP/1.1 403 Forbidden');
        echo "Access forbidden";
        die;
    }
}