PHP十六进制和RGB颜色互换
两个函数均未进行数据合法性验证:
十六进制颜色 preg_match('/^#([0-9a-f]{3}|[0-9a-f]{6})$/i', $hex)===1
RGB三个值均大于等于0小于等于255
function hex2rgb($hex) { $hex = str_replace("#", "", $hex); if(strlen($hex) == 3){ $r = hexdec(substr($hex,0,1).substr($hex,0,1)); $g = hexdec(substr($hex,1,1).substr($hex,1,1)); $b = hexdec(substr($hex,2,1).substr($hex,2,1)); }else{ $r = hexdec(substr($hex,0,2)); $g = hexdec(substr($hex,2,2)); $b = hexdec(substr($hex,4,2)); } return array($r, $g, $b); } function rgb2hex($rgb) { if(!is_array($rgb)) $rgb=explode(',', $rgb); $hex = "#"; $hex .= str_pad(dechex((int)$rgb[0]), 2, "0", STR_PAD_LEFT); $hex .= str_pad(dechex((int)$rgb[1]), 2, "0", STR_PAD_LEFT); $hex .= str_pad(dechex((int)$rgb[2]), 2, "0", STR_PAD_LEFT); return $hex; }
PHP数组函数
- array_change_key_case — 返回字符串键名全为小写或大写的数组
- array_chunk — 将一个数组分割成多个
- array_column — 返回数组中指定的一列
- array_combine — 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
- array_count_values — 统计数组中所有的值出现的次数
- array_diff_assoc — 带索引检查计算数组的差集
- array_diff_key — 使用键名比较计算数组的差集
- array_diff_uassoc — 用用户提供的回调函数做索引检查来计算数组的差集
- array_diff_ukey — 用回调函数对键名比较计算数组的差集
- array_diff — 计算数组的差集
- array_fill_keys — 使用指定的键和值填充数组
- array_fill — 用给定的值填充数组
- array_filter — 用回调函数过滤数组中的单元
- array_flip — 交换数组中的键和值
- array_intersect_assoc — 带索引检查计算数组的交集
- array_intersect_key — 使用键名比较计算数组的交集
- array_intersect_uassoc — 带索引检查计算数组的交集,用回调函数比较索引
- array_intersect_ukey — 用回调函数比较键名来计算数组的交集
- array_intersect — 计算数组的交集
- array_key_exists — 检查给定的键名或索引是否存在于数组中
- array_keys — 返回数组中部分的或所有的键名
- array_map — 将回调函数作用到给定数组的单元上
- array_merge_recursive — 递归地合并一个或多个数组
- array_merge — 合并一个或多个数组
- array_multisort — 对多个数组或多维数组进行排序
- array_pad — 用值将数组填补到指定长度
- array_pop — 将数组最后一个单元弹出(出栈)
- array_product — 计算数组中所有值的乘积
- array_push — 将一个或多个单元压入数组的末尾(入栈)
- array_rand — 从数组中随机取出一个或多个单元
- array_reduce — 用回调函数迭代地将数组简化为单一的值
- array_replace_recursive — 使用传递的数组递归替换第一个数组的元素
- array_replace — 使用传递的数组替换第一个数组的元素
- array_reverse — 返回一个单元顺序相反的数组
- array_search — 在数组中搜索给定的值,如果成功则返回相应的键名
- array_shift — 将数组开头的单元移出数组
- array_slice — 从数组中取出一段
- array_splice — 把数组中的一部分去掉并用其它值取代
- array_sum — 计算数组中所有值的和
- array_udiff_assoc — 带索引检查计算数组的差集,用回调函数比较数据
- array_udiff_uassoc — 带索引检查计算数组的差集,用回调函数比较数据和索引
- array_udiff — 用回调函数比较数据来计算数组的差集
- array_uintersect_assoc — 带索引检查计算数组的交集,用回调函数比较数据
- array_uintersect_uassoc — 带索引检查计算数组的交集,用回调函数比较数据和索引
- array_uintersect — 计算数组的交集,用回调函数比较数据
- array_unique — 移除数组中重复的值
- array_unshift — 在数组开头插入一个或多个单元
- array_values — 返回数组中所有的值
- array_walk_recursive — 对数组中的每个成员递归地应用用户函数
- array_walk — 使用用户自定义函数对数组中的每个元素做回调处理
- array — 新建一个数组
- arsort — 对数组进行逆向排序并保持索引关系
- asort — 对数组进行排序并保持索引关系
- compact — 建立一个数组,包括变量名和它们的值
- count — 计算数组中的单元数目或对象中的属性个数
- current — 返回数组中的当前单元
- each — 返回数组中当前的键/值对并将数组指针向前移动一步
- end — 将数组的内部指针指向最后一个单元
- extract — 从数组中将变量导入到当前的符号表
- in_array — 检查数组中是否存在某个值
- key_exists — 别名 array_key_exists
- key — 从关联数组中取得键名
- krsort — 对数组按照键名逆向排序
- ksort — 对数组按照键名排序
- list — 把数组中的值赋给一些变量
- natcasesort — 用"自然排序"算法对数组进行不区分大小写字母的排序
- natsort — 用"自然排序"算法对数组排序
- next — 将数组中的内部指针向前移动一位
- pos — current 的别名
- prev — 将数组的内部指针倒回一位
- range — 建立一个包含指定范围单元的数组
- reset — 将数组的内部指针指向第一个单元
- rsort — 对数组逆向排序
- shuffle — 将数组打乱
- sizeof — count 的别名
- sort — 对数组排序
- uasort — 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联
- uksort — 使用用户自定义的比较函数对数组中的键名进行排序
- usort — 使用用户自定义的比较函数对数组中的值进行排序
isset、array_key_exists判断数组键名是否存在的区别
由于 isset 属于 php 中的语言结构,而 array_key_exists 是函数,所以isset相对速度更快。
isset不只判断键名是否存在,还与键值有关,当键值为null时也返回 false,而array_key_exists则返回true。
MySQL old_passwords 问题(16位和41位加密模式)
mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication. Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD('your_existing_password'). This will store a new, and more secure, hash value in mysql.user. If this user is used in other scripts executed by PHP 5.2 or earlier you might need to remove the old-passwords flag from your my.cnf file
解决方法如下:
SET old_passwords = 0; UPDATE mysql.user SET PASSWORD = PASSWORD( 'root' ) WHERE User = 'root' LIMIT 1 ; SELECT LENGTH( PASSWORD ) FROM mysql.user WHERE User = 'root'; FLUSH PRIVILEGES ;
PHP运算符优先级
结合方向 | 运算符 | 附加信息 |
---|---|---|
无 | clone new | clone 和 new |
左 | [ | array() |
右 | ++ -- ~ (int) (float) (string) (array) (object) (bool) @ | 类型和递增/递减 |
无 | instanceof | 类型 |
右 | ! | 逻辑运算符 |
左 | * / % | 算术运算符 |
左 | + - . | 算术运算符和字符串运算符 |
左 | << >> | 位运算符 |
无 | == != === !== <> | 比较运算符 |
左 | & | 位运算符和引用 |
左 | ^ | 位运算符 |
左 | | | 位运算符 |
左 | && | 逻辑运算符 |
左 | || | 逻辑运算符 |
左 | ? : | 三元运算符 |
右 | = += -= *= /= .= %= &= |= ^= <<= >>= => | 赋值运算符 |
左 | and | 逻辑运算符 |
左 | xor | 逻辑运算符 |
左 | or | 逻辑运算符 |
左 | , | 多处用到 |
对具有相同优先级的运算符,左结合方向意味着将从左向右求值,右结合方向则反之。对于无结合方向具有相同优先级的运算符,该运算符有可能无法与其自身结合。举例说,在 PHP 中 1 < 2 > 1 是一个非法语句,而 1 <= 1 == 1 则不是。因为 T_IS_EQUAL
运算符的优先级比 T_IS_SMALLER_OR_EQUAL
的运算符要低。
UTF-8、UNICODE互转
<?php //UTF-8转UNICODE function utf8_unicode($s) { if (is_string($s)) { $s = mb_str_split($s); } $arr = array(); $n = 0; for ($i = 0; $i < count($s); $i++) { switch (strlen($s[$i])) { case 1: $n = ord($s[$i]); break; case 2: $n = (ord($s[$i][0]) & 63) << 6; $n += ord($s[$i][1]) & 63; break; case 3: $n = (ord($s[$i][0]) & 31) << 12; $n += (ord($s[$i][1]) & 63) << 6; $n += ord($s[$i][2]) & 63; break; case 4: $n = (ord($s[$i][0]) & 15) << 18; $n += (ord($s[$i][1]) & 63) << 12; $n += (ord($s[$i][2]) & 63) << 6; $n += ord($s[$i][3]) & 63; break; } $arr[] = $n; } return $arr; } function mb_str_split($str, $charset = 'utf-8', $length = 1) { if ($length < 1) { return FALSE; } $result = array(); for ($i = 0; $i < mb_strlen($str, $charset); $i += $length) { $result[] = mb_substr($str, $i, $length, $charset); } return $result; } //UNICODE转UTF-8 function unicode_utf8($u) { if (is_int($u)) { $u = array($u); } $arr = array(); $tmp = ''; for ($i = 0; $i < count($u); $i++) { if ($u[$i] < 128) { $tmp = $u[$i]; } else { if ($u[$i] < 2048) { $tmp = chr(192 | $u[$i] >> 6); $tmp .= chr(128 | $u[$i] & 63); } else { if ($u[$i] < 65536) { $tmp = chr(224 | $u[$i] >> 12); $tmp .= chr(128 | $u[$i] >> 6 & 63); $tmp .= chr(128 | $u[$i] & 63); } else { if ($u[$i] < 2097152) { $tmp = chr(240 | $u[$i] >> 18); $tmp .= chr(128 | $u[$i] >> 12 & 63); $tmp .= chr(128 | $u[$i] >> 6 & 63); $tmp .= chr(128 | $u[$i] & 63); } } } } $arr[] = $tmp; } return $arr; }
PHP生成静态页面
一种是利用模板技术,另一种是用ob系列函数。两种方法,看起来都差不多,但是实际上,却是不同的。
第一种:利用模板
目前PHP的模板可以说是很多了,有功能强大的smarty,还有简单易用的smarttemplate等。
它们每一种模板,都有一个获取输出内容的函数。我们生成静态页面的方法,就是利用了这个函数。用这个方法的优点是,代码比较清晰,可读性好。
这里我用smarty做例子,说明如何生成静态页
<?php
require('smarty/Smarty.class.php');
$t = new Smarty;
$t->assign("title","Hello World!");
$content = $t->fetch("templates/index.htm");
//这里的 fetch() 就是获取输出内容的函数,现在$content变量里面,就是要显示的内容了
$fp = fopen("archives/2005/05/19/0001.html", "wb");
fwrite($fp, $content);
fclose($fp);
?>
第二种方法:利用ob系列的函数
这里用到的函数主要是 ob_start(), ob_end_flush(), ob_get_content(),
其中ob_start()是打开浏览器缓冲区的意思,打开缓冲后,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区,直到你使用了ob_end_flush()。而这里最重要的一个函数,就是ob_get_contents(),这个函数的作用是获取缓冲区的内容,相当于上面的那个fetch(),道理一样的。代码:
<?php
ob_start();
$fp = fopen("ip.html", "wb");
fwrite($fp, ob_get_contents());//取得php页面输出的全部内容
fclose($fp);
ob_end_clean();
?>
PHP遍历文件件
<?php $dir = '.'; //当前目录 list_file($dir); function list_file($dir) { $list = scandir($dir); // 得到该文件下的所有文件和文件夹 foreach ($list as $file) { //遍历 $file_location = $dir . '/' . $file; //生成路径 if (is_dir($file_location) && $file != '.' && $file != '..') { //判断是不是文件夹 echo "------------------------sign in {$file_location}------------------"; echo '<br>'; list_file($file_location); } else { echo is_file($dir . '/' . $file) ? $dir . '/' . $file . '<br>' : ''; } } }
如遇文件名显示乱码,可用mb_convert_encoding 或 iconv 转换
文本内容return array()的使用
a.txt或a.php内容:
return array(
0 => 'hello',
1 => 'world',
);
调用:
<?php
$arr = eval(file_get_contents('a.txt'));
?>
方法二:
a.php内容:
<?php
return array(
0 => 'hello',
1 => 'world',
);
?>
调用:
<?php
$arr = @include $path.'a.php';
?>
PHP保存远程文件到本地
echo httpcopy("http://www.baidu.com/img/baidu_sylogo1.gif"); function httpcopy($url, $file="", $timeout=60) { $file = empty($file) ? pathinfo($url,PATHINFO_BASENAME) : $file; $dir = pathinfo($file,PATHINFO_DIRNAME); !is_dir($dir) && @mkdir($dir,0755,true); $url = str_replace(" ","%20",$url); if(function_exists('curl_init')) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $temp = curl_exec($ch); if(!curl_error($ch)){ $dest = fopen($file, 'wb'); fwrite($dest, $temp); fclose($dest); return $file; }else{ return false; } }elseif(function_exists('copy')) { $opts = array( "http"=>array( "method"=>"GET", "header"=>"", "timeout"=>$timeout) ); $context = stream_context_create($opts); if(@copy($url, $file, $context)) { //$http_response_header return $file; } else { return false; } }else{ $temp=fopen($url,'rb'); if($temp){ $newf=fopen($file,'wb'); if($newf){ while(!feof($temp)){ fwrite($newf,fread($temp,1024*8),1024*8); } } if($temp){ fclose($temp); } if($newf){ fclose($newf); } return $file; } } }