大部分有两三年工作经验的PHPer,都必定积累了不少在日常开发中使用的小技巧。从前端,接口开发,团队编程规范,模块化和前辈们分享的个人经验中总结出一些小技巧。这些技能都能大大地提高我们日常开发的效率,提升我们的代码质量,更能让你省下了很多看看书,看看博客,找妹子聊聊天的时间。以下是我个人从工作经验中总结的一些编程小技巧,其中可能也会包括一些前辈们分享的经验,如有更好的实现方法,可以留言分享一下您的宝贵经验,在下一次分享或者后续遍中进而补充。
一.常用函数/方法:
谈到函数,我的话就多了,在分享PHP小技巧中,莫过于大家都熟知的PHP函数有很多很多,那么日常工作中常用的大家也有很多离不开你的项目代码,离不开你的function.php或者commont.php函数库啦。以下是我的一些常用的函数,分享给大家。
1.高亮显示的断点调试工具(灵活实用它可以不局限于断点和backgroup):
-
function debug($data){
-
-
if(
empty($data)){
-
var_dump($data);
-
die;
-
}
-
-
if(!is_array($data)){
-
echo
"<pre style='background-color: #000;color: #fff;font-size: 14px;min-height: 100px;line-height: 50px;'>";
-
echo
"<span style='margin-left: 20px;font-size: 18px;'>";
-
print_r($data);
-
echo
"</span>";
-
echo
"</pre>";
-
die;
-
}
-
-
echo
"<pre style='background-color: #000;color: #fff;font-size: 14px;min-height: 100px;'>";
-
echo
"<br /><br /><br /><span style='margin-left: 20px;font-size: 13px;'>";
-
print_r($data);
-
echo
"</span><br /><br /><br />";
-
echo
"</pre>";
-
die;
-
}
2.递归无限极分类(要坚决鄙视写数据库操作在循环里或者写在递归里的垃圾代码):
-
/* @param $data array 数据
-
* @param $pid int 父类关系值
-
* @param $parentFieldstring 父类字段
-
* @param $pkField string 主键字段
-
* return array
-
*/
-
function getTreesPro($data,$pid='0',$parentField='pid',$pkField='id'){
-
$tree =
array();
-
foreach($data
as $k=>$v){
-
-
if($v[$parentField] == $pid){
-
$temp = getTreesPro($data,$v[$pkField]);
//$data是对象则改为$v->$pkField
-
if(!
empty($temp)){
-
//分层
-
$v[
'son']= getTreesPro($data,$v[$pkField]);
-
}
-
$tree[] = $v;
-
}
-
}
-
return $tree;
-
}
3.数组转对象
-
function arrayToObject($arr){
-
if(is_array($arr)){
-
return (object) array_map(
__FUNCTION__, $arr);
-
}
else{
-
return $arr;
-
}
-
}
4.对象转数组
-
function object2array(&$object) {
-
$object = json_decode( json_encode( $object),
true);
-
return $object;
-
}
5.生成唯一订单号
-
function generateJnlNo() {
-
date_default_timezone_set(
'PRC');
-
$yCode =
array(
'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J');
-
$orderSn =
'';
-
$orderSn .= $yCode[(intval(date(
'Y')) -
1970) %
10];
-
$orderSn .= strtoupper(dechex(date(
'm')));
-
$orderSn .= date(
'd').substr(time(),
-5);
-
$orderSn .= substr(microtime(),
2,
5);
-
$orderSn .= sprintf(
'%02d', mt_rand(
0,
99));
-
//echo $orderSn,PHP_EOL; //得到唯一订单号:G107347128750079
-
return $orderSn;
-
}
6.将一个二维数组转换为 HashMap,并返回结果
-
/**
-
* 用法1:
-
* @code php
-
*
$rows = array(
-
* array(
'id' => 1,
'value' =>
'1-1'),
-
* array(
'id' => 2,
'value' =>
'2-1'),
-
*);
-
*
$hashmap = Helper_Array::hashMap(
$rows,
'id',
'value');
-
*
-
* dump(
$hashmap);
-
* // 输出结果为
-
* // array(
-
* // 1 =>
'1-1',
-
* // 2 =>
'2-1',
-
* //)
-
* @endcode
-
*
-
* 如果省略
$value_field 参数,则转换结果每一项为包含该项所有数据的数组。
-
*
-
* 用法2:
-
* @code php
-
*
$rows = array(
-
* array(
'id' => 1,
'value' =>
'1-1'),
-
* array(
'id' => 2,
'value' =>
'2-1'),
-
*);
-
*
$hashmap = Helper_Array::hashMap(
$rows,
'id');
-
*
-
* dump(
$hashmap);
-
* // 输出结果为
-
* // array(
-
* // 1 => array(
'id' => 1,
'value' =>
'1-1'),
-
* // 2 => array(
'id' => 2,
'value' =>
'2-1'),
-
* //)
-
* @endcode
-
*
-
* @param array
$arr 数据源
-
* @param string
$key_field 按照什么键的值进行转换
-
* @param string
$value_field 对应的键值
-
*
-
* @
return array 转换后的 HashMap 样式数组
-
*/
-
function to_hashmap(
$arr,
$key_field,
$value_field = null){
-
$ret = array();
-
if (
$value_field){
-
foreach (
$arr as
$row){
-
$ret[
$row[
$key_field]] =
$row[
$value_field];
-
}
-
}
-
else{
-
foreach (
$arr as
$row){
-
$ret[
$row[
$key_field]] =
$row;
-
}
-
}
-
return
$ret;
-
}
7.从二位数组中,取出某字段的所有结果(包含重复结果)
如从$brandList数据中取出所有id的值:$ids = array_column($brandList,'id'); 去重结果 $ids= array_unique(array_column($brandList,'id'));
-
if (!function_exists(
'array_column')) {
-
-
/**
-
* Returns the values from a single column of the input array, identified by
-
* the $columnKey.
-
*
-
* Optionally, you may provide an $indexKey to index the values in the returned
-
* array by the values from the $indexKey column in the input array.
-
*
-
* @param array $input A multi-dimensional array (record set) from which to pull
-
* a column of values.
-
* @param mixed $columnKey The column of values to return. This value may be the
-
* integer key of the column you wish to retrieve, or it
-
* may be the string key name for an associative array.
-
* @param mixed $indexKey (Optional.) The column to use as the index/keys for
-
* the returned array. This value may be the integer key
-
* of the column, or it may be the string key name.
-
* @return array
-
*/
-
function array_column($input = null, $columnKey = null, $indexKey = null){
-
// Using func_get_args() in order to check for proper number of
-
// parameters and trigger errors exactly as the built-in array_column()
-
// does in PHP 5.5.
-
$argc = func_num_args();
-
$params = func_get_args();
-
if ($argc <
2) {
-
trigger_error(
"array_column() expects at least 2 parameters, {$argc} given", E_USER_WARNING);
-
return
array();
-
}
-
if (!is_array($params[
0])) {
-
trigger_error(
'array_column() expects parameter 1 to be array, ' . gettype($params[
0]) .
' given', E_USER_WARNING);
-
return
array();
-
}
-
if (!is_int($params[
1])
-
&& !is_float($params[
1])
-
&& !is_string($params[
1])
-
&& $params[
1] !==
null
-
&& !(is_object($params[
1]) && method_exists($params[
1],
'__toString'))
-
) {
-
trigger_error(
'array_column(): The column key should be either a string or an integer', E_USER_WARNING);
-
return
array();
-
}
-
if (
isset($params[
2])
-
&& !is_int($params[
2])
-
&& !is_float($params[
2])
-
&& !is_string($params[
2])
-
&& !(is_object($params[
2]) && method_exists($params[
2],
'__toString'))
-
) {
-
trigger_error(
'array_column(): The index key should be either a string or an integer', E_USER_WARNING);
-
return
array();
-
}
-
$paramsInput = $params[
0];
-
$paramsColumnKey = ($params[
1] !==
null) ? (string) $params[
1] :
null;
-
$paramsIndexKey =
null;
-
if (
isset($params[
2])) {
-
if (is_float($params[
2]) || is_int($params[
2])) {
-
$paramsIndexKey = (int) $params[
2];
-
}
else {
-
$paramsIndexKey = (string) $params[
2];
-
}
-
}
-
$resultArray =
array();
-
foreach ($paramsInput
as $row) {
-
$key = $value =
null;
-
$keySet = $valueSet =
false;
-
-
if ($paramsIndexKey !==
null && array_key_exists($paramsIndexKey, $row)) {
-
$keySet =
true;
-
$key = (string) $row[$paramsIndexKey];
-
}
-
if ($paramsColumnKey ===
null) {
-
$valueSet =
true;
-
$value = $row;
-
}
elseif (is_array($row) && array_key_exists($paramsColumnKey, $row)) {
-
$valueSet =
true;
-
$value = $row[$paramsColumnKey];
-
}
-
if ($valueSet) {
-
if ($keySet) {
-
$resultArray[$key] = $value;
-
}
else {
-
$resultArray[] = $value;
-
}
-
}
-
}
-
return array_unique($resultArray);
-
}
-
}
8.客户端缓存方法
-
public
function cache($seconds_to_cache = 3600){
-
$ts = gmdate(
"D, d M Y H:i:s", time() + $seconds_to_cache) .
" GMT";
-
header(
"Expires: $ts");
-
header(
"Pragma: cache");
-
header(
"Cache-Control: max-age=$seconds_to_cache");
-
}
9.客户端不缓存方法
-
public
function disCache(){
-
$ts = gmdate(
"D, d M Y H:i:s",strtotime(
'-1 year')) .
" GMT";
-
header(
"Expires: $ts");
-
header(
"Last-Modified: $ts");
-
header(
"Pragma: no-cache");
-
header(
"Cache-Control: no-cache, must-revalidate");
-
}
10.返回上一个页面来源
-
public
function referer(){
-
return $_SERVER[
'HTTP_REFERER'];
-
}
11.分页方法(在api方面用得比较多)
-
public
function pageinfo(){
-
$pageinfo =
new \stdClass;
-
$pageinfo->length =
isset($_GET[
'length']) ? $_GET[
'length'] :
$this->length;
-
$pageinfo->page =
isset($_GET[
'page']) ? $_GET[
'page'] :
1;
-
$pageinfo->end_id =
isset($_GET[
'end_id']) ? $_GET[
'end_id'] :
1;
-
$pageinfo->offset= $pageinfo->page<=
1 ?
0 : ($pageinfo->page
-1) * $pageinfo->length;
-
$pageinfo->totalNum = $pageinfo->totalNum? $pageinfo->totalNum :
0;
-
$pageinfo->totalPage = $pageinfo->totalNum / $pageinfo->length;
-
-
return $pageinfo;
-
}