## 主要特點
PHP 常用函數總結
## 二、php中對象轉數組有哪些方法
### 1、用(array)方式遞歸轉化(實質是解決對象里還有對象的問題
//PHP stdClass Object轉array
function object_array($array) {
if(is_object($array)) {
$array = (array)$array;
}
if(is_array($array)) {
foreach($array as $key=>$value) {
$array[$key] = object_array($value);
}
}
return $array;
}
結果是對的,但是對象的屬性如果是protected的話,轉換成數組的鍵的時候屬性名前會加上\*字符
array(9) {
["*questions"] => array(21) {
[0] => array(13) {
["bq_id"] => int(28)
["bq_b_id"] => int(5)
這個\*是因為我的屬性是protected的,如果屬性換成public,就沒有了
### 2、轉$xmlString的
~~~
$array = json_decode(json_encode(simplexml_load_string($xmlString)),TRUE);
~~~
### 3、json\_decode(json\_encode($array),true)方式
這個你對象首先能被json\_encode才行
~~~
4.如果是10W的數據量的話,執行要進1s,結構再復雜些,可以達到3s,性能太差了,可以用以下替換:
function object2array(&$object) {
$object = json_decode( json_encode( $object),true);
return $object;
}
~~~
### 4、$arr = (array)$obj方式轉化的效果
如果對象里面沒有對象,這個方法是對的
對象里面還有對象,就得用第一種遞歸的方式將所有的對象都轉換成數組
# 判斷是否傳入必要參數
~~~
/**
* 判斷是否傳入必要參數
* @param [type] $inter_param [description]
* @param [type] $agency [description]
* @param [type] $merchant [description]
* @return [type] [description]
*/
function judge_parameter($param){
if(!isset($param['inter_param']) || !isset($param['agency']) || !isset($param['merchant'])){
return false;
}
if(empty($param['inter_param']) || empty($param['agency']) || empty($param['merchant'])){
return false;
}
return true;
}
~~~
# 判斷數組類型參數是否含有空元素值
~~~
//$param array
function is_arraynull($param){
if(!is_array($param)){
return '0';
}else{
foreach ($param as $key => $value) {
if($value!=''){
$ret = is_arraynull($value);
}else{
return 1;
}
}
}
}
~~~
# 接收異步過來的get消息
~~~
$sms_result_data = $_GET; //用這種
$param = request()->param(); //thinkphp5接收消息
$sms_result_data1 = file_get_contents("php://input");
~~~
# 判斷路徑是文件還是目錄
~~~
function f_type($f_path){
return is_dir($f_path)?'dir':suffixtype($f_path);
}
~~~
* * *
# 計算文件或目錄字節大小
~~~
//計算文件或目錄字節大小
function bytesize_calc($f_path){
if(!is_dir($f_path)){
return sprintf("%u", filesize($f_path));}
$bytesize = 0;
$f_arr = scandir($f_path);
$size = count($f_arr);
for($i=0;$i<$size;$i++){
if('.'==$f_arr[$i]||'..'==$f_arr[$i])continue;
$file_or_dir = $f_path.'/'.$f_arr[$i];
$bytesize += bytesize_calc($file_or_dir);
}
return $bytesize;
}
//獲得文件大小
function f_size($f_path){
return size_formate(bytesize_calc($f_path));
}
~~~
# 獲取文件后綴名,并判斷是否在定義的數組中
~~~
/**
* 獲取文件后綴名,并判斷是否合法
*
* @param string $file_name //是一個文件的路徑
* @param array $allow_type //需要的文件類型數組
* @return blob
*/
function get_file_suffix($file_name, $allow_type = array())
{
$file_suffix = strtolower(array_pop(explode('.', $file_name)));
if (empty($allow_type))
{
return $file_suffix;
}
else
{
if (in_array($file_suffix, $allow_type))
{
return true;
}
else
{
return false;
}
}
}
~~~
# 默認獲得文件修改時間
~~~
function filetime($way,$char='m'){
date_default_timezone_set('PRC');
switch($char){
case 'c':$localtime = date('Y-m-d H:i:s',filectime($way));
break;
case 'm':$localtime = date('Y-m-d H:i:s',filemtime($way));
break;
case 'a':$localtime = date('Y-m-d H:i:s',fileatime($way));
break;
}
return $localtime;
}
~~~
# 檢查目標文件夾是否存在,如果不存在則自動創建該目錄
~~~
/**
* 檢查目標文件夾是否存在,如果不存在則自動創建該目錄
*
* @access public
* @param string folder 目錄路徑。不能使用相對于網站根目錄的URL
*
* @return bool
*/
function make_dir($folder)
{
$reval = false;
if (!file_exists($folder))
{
/* 如果目錄不存在則嘗試創建該目錄 */
@umask(0);
/* 將目錄路徑拆分成數組 */
preg_match_all('/([^\/]*)\/?/i', $folder, $atmp);
/* 如果第一個字符為/則當作物理路徑處理 */
$base = ($atmp[0][0] == '/') ? '/' : '';
/* 遍歷包含路徑信息的數組 */
foreach ($atmp[1] AS $val)
{
if ('' != $val)
{
$base .= $val;
if ('..' == $val || '.' == $val)
{
/* 如果目錄為.或者..則直接補/繼續下一個循環 */
$base .= '/';
continue;
}
}
else
{
continue;
}
$base .= '/';
if (!file_exists($base))
{
/* 嘗試創建目錄,如果創建失敗則繼續循環 */
if (@mkdir(rtrim($base, '/'), 0777))
{
@chmod($base, 0777);
$reval = true;
}
}
}
}
else
{
/* 路徑已經存在。返回該路徑是不是一個目錄 */
$reval = is_dir($folder);
}
clearstatcache();
return $reval;
}
~~~
# 獲取隨機字符串
~~~
/**
* 隨機字符
* @param int $length 長度
* @param string $type 類型
* @param int $convert 轉換大小寫 1大寫 0小寫
* @return string
*/
function random($length=10, $type='letter', $convert=0)
{
$config = array(
'number'=>'1234567890',
'letter'=>'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
'string'=>'abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789',
'all'=>'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
);
if(!isset($config[$type])) $type = 'letter';
$string = $config[$type];
$code = '';
$strlen = strlen($string) -1;
for($i = 0; $i < $length; $i++){
$code .= $string{mt_rand(0, $strlen)};
}
if(!empty($convert)){
$code = ($convert > 0)? strtoupper($code) : strtolower($code);
}
return $code;
}
~~~
# 獲取當前文件所在的文件路徑
~~~
define('CUR_API_PATH', rtrim(str_replace('\\', '/', dirname(__FILE__)),'/').'/');
~~~
# PHP限制IP訪問 只允許指定IP訪問 允許\*號通配符過濾IP
~~~
/**
* 檢測訪問的ip是否為規定的允許的ip
* Enter description here ...
*/
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
}
}
}//end for
if($bl){//如果是true則找到有一個匹配成功的就返回
return;
die;
}
}
}//end foreach
header('HTTP/1.1 403 Forbidden');
echo "Access forbidden";
die;
}
}
~~~
# api返回信息
~~~
/**
* 數據返回
* @param [int] $code [結果碼 200:正常/4**數據問題/5**服務器問題]
* @param [string] $msg [返回的提示信息]
* @param [array] $data [返回的數據]
* @return [string] [最終的json數據]
*/
public function return_msg($code, $msg = '', $data = []) {
/*********** 組合數據 ***********/
$return_data['code'] = $code;
$return_data['msg'] = $msg;
$return_data['data'] = $data;
/*********** 返回信息并終止腳本 ***********/
echo json_encode($return_data,JSON_UNESCAPED_UNICODE);
die;
}
~~~
# php常用自定義函數類下載
[https://pan.baidu.com/s/18ZuQm5cx3ynQtQqcQgK0Vw](https://pan.baidu.com/s/18ZuQm5cx3ynQtQqcQgK0Vw)
* * *
# php 設置字符編碼為utf-8
`header("Content-Type: text/html;charset=utf-8");`
* * *
# GB2312和utf8相互轉換
~~~
echo iconv('GB2312', 'UTF-8//IGNORE', $str); //將字符串的編碼從GB2312轉到UTF-8
//ignore的意思是忽略轉換時的錯誤,如果沒有ignore參數,所有該字符后面的字符串都無法被保存。
iconv("UTF-8","GB2312//IGNORE",$data);
print_r(iconv_get_encoding()); //得到當前頁面編碼信息
// 轉碼
function gbk($str){return iconv('utf-8','gbk',$str);}
function utf8($str){return iconv('gbk','utf-8',$str);}
~~~
# 路徑格式化(替換雙斜線為單斜線)
~~~
function path_formate($str){
return str_replace('\\\\','\\',$str);
}
~~~
* * *
# 獲取當前文件的目錄
~~~
方法一:
define('BASE_PATH',rtrim(str_replace('\\','/',__DIR__).'/'));
方法二:
define('BASE_DIR', rtrim(str_replace('\\', '/', dirname(__FILE__)),'/').'/');
~~~
* * *
# 打印輸出
~~~
function dump($var)
{
echo '<pre>';
print_r($var);
echo '</pre>';
}
function vp($var)
{
echo '<pre>';
var_dump($var);
echo '</pre>';
}
function dd($var)
{
echo '<pre>';
var_dump($var);
echo '</pre>';
die;
}
~~~