tools。php,phpTools/tools.php at master · superve/phpTools · GitHub
######### 数值操作扩展 #########
/**
*检测两个实数区间是否相交
*
*@date 2014/12/11 15:20
*@scenario 碰撞检测; 业务要求能够自定义分时间段设置价格策略时
*
*@param array _interval1 第一个区间[0]表示区间的开始, [1]表示区间的结束
*@param array _interval2 第二个区间[0]表示区间的开始, [1]表示区间的结束
*@return boolean 相交返回true, 否则返回 false
**/
function areIntervalsOverlapped( $_interval1, $_interval2 ){
if( $_interval1[1] < $_interval2[0] || $_interval2[1] < $_interval1[0] ){
return false;
}
return true;
}//func
######### 无限分类操作 #########
/**
*垂直层次 溯祖函数
*
*@date 2015/10/08 09:11
*@dependence 依赖于vHirarchify(), $_vList通过调用vHirarchify函数返回的
*
*@param array _vList 垂直结构的分类列表
*@param int _id待追溯其祖先的 节点的id值
*@param array _fields 返回的节点(节点二维数组)中,包含哪些字段
*@param array _cateInfo 定义实际字段,以适合表结构不同的情况
* id表示给定_vList节点中作为id的字段
* childs表示,如果_vList节点含有子元素,其子元素的键名
*@return array 从根到指定节点名称的数组
**/
function vTraceRoot( $_vList, $_id, $_fields = array('name'), $_cateInfo = array('id' => 'id', 'childs'=>'childs') ){
$pathToRoot = array();//待返回的数组
list($id, $childs) = array( $_cateInfo['id'], $_cateInfo['childs'] );//设置变量
$_fields = empty($_fields) ? array('name') : $_fields;//默认显示的字段
foreach( $_vList as $vList ){
if( $vList[$id] == $_id ){//如果找到指定节点
$tmp = array();
foreach( $_fields as $field ){
$tmp[$field] = $vList[$field];
}
array_unshift( $pathToRoot, $tmp );
return $pathToRoot;
}
//如果当前节点还有子节点
if( $vList[$childs] ){
$pathToRoot = vTraceRoot( $vList[$childs], $_id, $_fields, $_cateInfo );
if( !empty($pathToRoot) ){//如果属于一条脉络上的
$tmp = array();
foreach( $_fields as $field ){
$tmp[$field] = $vList[$field];
}
array_unshift( $pathToRoot, $tmp );
return $pathToRoot;
}
}//if
}//foreach
return $pathToRoot;
}//vTraceRoot
/**
*水平层次 溯祖函数
*@2015/10/08 09:11
*@dependence 依赖于hHirarchify(), $_hList通过调用hHirarchify函数返回的
*
*@param array _hList 水平结构的分类列表
*@param int _id待追溯其祖先的 节点的id值
*@param array _fields 返回的节点(节点二维数组)中,包含哪些字段
*@param array _cateInfo 定义实际字段,以适合表结构不同的情况
* id表示给定_vList节点中作为id的字段
* childs表示,如果_vList节点含有子元素,其子元素的键名
*@return array 从根到指定节点名称的数组
**/
function hTraceRoot( $_hList, $_id, $_fields = array( 'name' ), $_cateInfo = array('id' => 'id', 'pid'=>'pid') ){
$pathToRoot = array();//待返回数组
list($id, $pid) = array( $_cateInfo['id'], $_cateInfo['pid']);
$_fields = empty($_fields) ? array('name') : $_fields;//默认显示的字段
foreach( $_hList as $item ){
if( $item[$id] != $_id ) continue;
$tmp = array();
foreach( $_fields as $field ){//复制所需要的字段
$tmp[$field] = $item[$field];
}
array_unshift($pathToRoot, $tmp);
if( 0 == $item[$pid] ){//如果当前元素已经是Root
break;
}else{
$pathToRoot = array_merge( hTraceRoot( $_hList, $item[$pid], $_fields, $_cateInfo ), $pathToRoot);
}
}//foreach
return $pathToRoot;
}//hTraceRoot
/**
*通过水平层次的分类列表, 来获取某顶级节点id下的指定层级范围内的所有后代节点id
*
*@date2015/10/07
*@dependence 依赖于hHirarchify(), $_hList通过调用hHirarchify函数返回的
*@notes 要想此函数正常工作,必须使得_level, _cateInfo与上一次调用hHirarchify()是设置的参数一致
*@scenario 随机获取某个顶级类下面所有叶子分类下的商品
*@TODO 函数还不够完善
*精确控制获得子孙的层次
*
*@param array _hList 水平层次的分类数组
*@param int _id 待获取其后代节点id集的元素节点id
*@param int _level 如果后代节点所处的层次<=_level, 才返回
* @param array _cateInfo 自定义id, pid, level对应的字段名(因为用户的数据表字段设置各不相同)
* 但是只要依据此三个字段,就可以实现通用情况)
*@return array 返回找到的子节点中_cateinfo['id']字段(即作为id的字段)的值的集合
*/
function hGetDescendantIds($_hList, $_id, $_level = 0,
$_cateInfo = array('id'=>'id', 'pid'=>'pid', 'level'=>'level') ){
list( $id, $pid, $level ) = array( $_cateInfo['id'], $_cateInfo['pid'], $_cateInfo['level'] );
$retAry = array();
foreach( $_hList as $item ){
if( $item[$pid] == $_id ){
if( $item[$level] >= $_level ){//限制保留的层级
$retAry[] = $item[$id];
}
$retAry = array_merge( $retAry, hGetDescendantIds( $_hList, $item[$id], $_level, $_cateInfo) );
}
}//foreach
return $retAry;
}//hGetDescendantIds
/** 层次化某个列表
* 垂直层次化(Vertically Hirarchify), 层次体现于结构,便于循环嵌套显示
* 子层次可以通过节点的childs键来访问
*
* @author lucifer-v.
* @date 2015/08/28
* @changelog
*2015/10/06 调整_excludeIds与_cateInfo位置;改变$id, $pid, $level变量赋值方式
*2015/10/05 添加参数_excludeIds
* @todo 针对于对象的扩展
*
* @param array _list 待进行层次化的某个分类列表
* @param int _pid 从父id为0的元素开始构造分类层次
* @param int _level 父类id为_pid的元素所在的层次数
* @param array _exclueIds 如果id在此数组中,那么此元素不纳入分类,null表示不排除
* @param array _cateInfo 自定义id, pid, level对应的字段名(因为用户的数据表字段设置各不相同)
* 但是只要依据此三个字段,就可以实现通用无限分类,并且凸显层次)
* @return array 一个具有垂直结构的分类结构
**/
function vHirarchify($_list, $_pid = 0,$_level = 0, $_excludeIds = array(),
$_cateInfo = array("id"=>"id","pid"=>"pid", "level"=>"level") ){
$retList = array(); //待返回数组
list($id,$pid,$level)= array( $_cateInfo['id'], $_cateInfo['pid'], $_cateInfo['level'] );
if( null == $_excludeIds ){ $_excludeIds = array(); }
foreach($_list as $item){ //寻找父元素为指定pid的
if( in_array( $item[$id], $_excludeIds) )continue;//跳过被排除的id
if( $item[$pid] == $_pid ){
$item[$level] = $_level;
$retList[] = $item;
}
}//foreach
foreach( $retList as &$item ){ //获取孩子节点
$item['childs'] = vHirarchify($_list, $item[$id], $_level + 1, $_excludeIds, $_cateInfo);
}//foreach
return $retList;
}//vHirarchify
/** 层次化某个列表
* 水平层次化(Horizontally Hirarchify),使用level代表层次信息,适合下拉列表中显示
*
* @author lucifer-v.
* @date 2015/08/28
* @changelog
*2015/10/06 调整_excludeIds与_cateInfo位置;改变$id, $pid, $level变量赋值方式
*2015/10/05 添加参数_excludeIds
* @todo 针对于对象的扩展
*
* @param array _list 待进行层次化的某个分类列表
* @param int _pid 从父id为0的元素开始构造分类层次
* @param int _level 父类id为_pid的元素所在的层次数
* @param array _exclueIds 如果id在此数组中,那么此元素不纳入分类,null表示不排除
* @param array _cateInfo 自定义id, pid, level对应的字段名(因为用户的数据表字段设置各不相同)
* 但是只要依据此三个字段,就可以实现无限分类,并且凸显层次)
* @return array 一个具有水平结构的分类结构
**/
function hHirarchify( $_list, $_pid = 0, $_level = 0, $_excludeIds = array(),
$_cateInfo = array("id"=>"id","pid"=>"pid", "level"=>"level") ){
$retList = array(); //待返回列表
list($id, $pid, $level) = array( $_cateInfo['id'], $_cateInfo['pid'], $_cateInfo['level'] );//局部变量赋值
if( null === $_excludeIds ){ $_excludeIds = array(); }
foreach( $_list as $item ){
if( in_array( $item[$id], $_excludeIds) )continue;//跳过被排除的id
if( $item[$pid] == $_pid ){ //查找子元素
$item[$level] = $_level;
$retList[] = $item;
//查找子元素的子元素
$retList = array_merge($retList , hHirarchify( $_list, $item[$id], $_level + 1, $_excludeIds, $_cateInfo ) );
}
}//for
return $retList;
}//hHirarchify
/**
*检测字符串中是否含有utf8编码的中文
*
*@date 2015/10/09 11:03
*
*@param string _str 待检测的字符串
*@return boolean true : 如果含有
* false : 如果不含有
*/
function isIncludeUtf8Cn( $_str ){
$pattern = '/[\x{4e00}-\x{9fa5}]/u';
return ( preg_match( $pattern, $_str ) > 0 )? true : false ;
}//func
/**
*验证给定的定点数是否合法
*验证规则:总长度(不包括点号)不超过_totalLen, 小数位数不超过_decLen即视为合法
*@author lucifer-v.
*@date2015/10/05 17:37
*@lastmodify 2015/11/01 12:39
*
*@param string _decimal 待验证其合法性的定点数
*@param int _totalLen 允许的定点数总长度(不包括小数点)
*@param int _decLen 允许的定点数小数部分最大长度
*@return true / false
*/
function isDecimalValid( $_decimal, $_totalLen, $_decLen ){
//参数长度不合法则返回false
if( $_totalLen <= $_decLen ) return false;
//如果含有除数字和.以外的字符,返回false
if( preg_match( '/[^0-9.]/', $_decimal ) ) return false;
$hasDot = (false === strpos($_decimal, '.')) ? false: true ;//是否是小数
$pattern = '/^\d{1,'.$_totalLen.'}$/';//如果是整数的情况
if( $hasDot ){//如果含有小数
$decComps = explode('.', $_decimal);
$facLen = min($_decLen, strlen($decComps[1]));//实际的小数位数
if( 0 == $facLen){//考虑到实时输入是会出现'12.'的情况
return false;
}
$pattern = '/^\d{1,'.($_totalLen - $facLen).'}\.\d{1,'.$facLen.'}$/';
}
return ( preg_match($pattern, $_decimal) > 0 ) ? true : false;
}//isDecimalValid
/**
*整数是否合法 (验证4*2=8种类型的整数)
*只支持到4294967295, 亦即mysql的int unsigned类型,
*这对于一般的业务已经完全够用
*@author lucifer-v.
*@date 2015/10/05 18:58
*
*@param int _int 待检测的整数
*@param int _type 整数类型("tinyint|smallint|mediumint|int")
*@param boolen _unsigned 有符号false, 无符号true
*@reutrn 合法 返回true, 非法返回false
*/
function isIntegerValid( $_int, $_type = 'int', $_unsigned = false ){
$pattern = '/^\d+$/';
if( preg_match($pattern, $_int) == 0 ){//如果形式上不是整数
return false;
}
//从精度上判断
if( $_unsigned ) $min = 0;
$type = strtolower($_type . $_unsigned);//整数类型
switch( strval($_type . $_unsigned) ){
case 'tinyint' : { $min = -128;$max = 127; break; }
case 'tinyint1' : { $max = 255; break; }
case 'smallint' : { $min = -32768; $max = 32768; break; }
case 'smallint1' : { $max = 65535; break; }
case 'mediumint' : { $min = -8388608; $max = 8388607; break; }
case 'mediumint1' : { $max = 16777215; break; }
case 'int' : { $min = -2147483648; $max = 2147483647; break; }
case 'int1' : { $max = 4294967295; break; }
}//switch
return ( $min <= $_int && $_int <= $max ) ? true : false;
}//isIntegerValid
/**
*Email是否合法
*
*@author lucifer-v.
*@date 2015/09/02 14:42
*@lastmdate 2015/10/07 17:26
*@param string email电子邮件
*@return int true=合法; false=不合法
*/
function isEmailValid( $_email ){
$pattern = '/^[\-\w]+@\w+(\.\w+)+$/';
return ( preg_match($pattern, $_email) > 0 ) ? true : false ;
}//func
/**
*邮政编码是否合法
*
*@author lucifer-v.
*@date 2015/09/02 14:42
*@lastmdate 2015/10/07 17:26
*@param string _qqnum qq号码
*@return int true=合法; false=不合法
*/
function isZipcodeValid( $_zipcode ){
$pattern = '/^[1-9]\d{5}$/';
return ( preg_match($pattern, $_zipcode) > 0) ? true : false ;
}
/**
*验证QQ号码是否合法
*
*@author lucifer-v.
*@date 2015/10/04 23:47
*@lastmdate 2015/10/07 17:26
*@param string _qqnum qq号码
*@return int 1=合法; 0=不合法
*/
function isQQValid( $_qqnum ){
$pattern = '/^[1-9]\d{5,}$/';
return ( preg_match($pattern, $_qqnum) > 0) ? true : false ;
}//func
/**
*验证手机号码是否合法
*
*@author lucifer-v.
*@date 2015/09/02 14:42
*@lastmdate 2015/10/07 17:26
*@param string _phonenum 手机号码
*@return int true=合法; false=不合法
*/
function isMobilephoneValid( $_phonenum ){
$pattern = '/^1\d{10}$/';
return ( preg_match($pattern, $_phonenum) > 0 ) ? true : false ;
}
######### 日期/时间扩展 ##########
/***
*得到时间戳,包含毫秒
*
*@date 2015/10/28
*@apply 用于测试代码执行时间
*
*@return float 当前时间戳
*/
function getMicrotime(){
list($microSec, $sec) = explode(' ', microtime());
return $sec + $microSec;
}//getMicrotime
/**
*根据时间戳得到中文的星期
*
*@date 2015/09/02 14:42
*@param int _timeStamp 时间戳
*@return string 星期N
*/
function getCnWeekName( $_timeStamp ){
switch(date('N' , $_timeStamp) ){
case '1': return '星期一';
case '2': return '星期二';
case '3': return '星期三';
case '4': return '星期四';
case '5': return '星期五';
case '6': return '星期六';
case '7': return '星期日';
}
}//func
/**
*将'YYYYMMDD'格式的年月字符串格式化为'YYYY*MM*DD'格式的
*其中的'*'表示分隔符
*
*@date 2015/10/09 19:02
*
*@param string _datestr 待格式化的字符串
*@param string _delim 格式分隔符
*@return string 格式化以后的字符串
*/
function datestrf( $_datestr, $_delim = '/'){
if( preg_match('/\D/', $_datestr) > 0 ){//明显包含非数值字符时
return false;
}
$_datestr = trim( $_datestr );//去掉括号
$pattern = '/^(\d{4})(\d{2})(\d{2})$/';//标准匹配模式
$len = strlen($_datestr);
if( 6 == $len ){//如果省去了世纪,年份>69 则19XX,否则20XX
$pattern = '/^(\d{2})(\d{2})(\d{2})$/';
preg_match( $pattern, $_datestr, $match );
$year = ( $match[1] > 69 ) ? '19'.$match[1] : '20'.$match[1] ;
return implode( $_delim, array( $year, $match[2], $match[3] ) );
}
//长度不是6
if( preg_match($pattern, $_datestr, $match) > 0){
return implode( $_delim, array( $match[1], $match[2], $match[3] ) );
}
return false;
}//datestrf
########### 其他工具 ############
/** 交换两个变量的值 **/
function swap(&$_var1, &$_var2){
list($_var1, $_var2) = array($_var2, $_var1);
}//func
/**
*格式化输出变量,保留换行
*@date 2015/10/06 09:28
*@lastmdate 2015/10/09 10:55
*
*@param mixed [...] 可变参数
*/
function dumpf( ){
foreach( func_get_args() as $arg ){
echo "
";
var_dump( $arg );
echo "
";
}
}//func
/**
*获取文件(或资源)的文件名
*
*@author Lucifer-v.
*@date 2015/10/04 23:15
*@param string _uri 给定的文件路径
*@return 返回文件的文件名
*/
function getFilename( $_uri ){
return explode( '.', getBasename($_uri) )[0];
}//func
/**
*获取文件(或资源)的扩展名(带点)
*
*@author Lucifer-v.
*@date 2015/09/14 10:26
*@param string _uri 给定的文件路径
*@return 返回文件的扩展名
*/
function getExtname( $_uri ){
return strrchr( getBasename( $_uri ) , '.');
}//func
/**
*获取文件(或URI)的基名,即最末尾的文件名+扩展名
*
*@author Lucifer-v.
*@date 2015/09/14 10:15
*@param string _uri 给定的文件路径
*@return 返回文件的基名称
*/
function getBasename($_uri){
if( null == $_uri )return null;
$_uri = str_replace('\\', '/', $_uri); //路径处理
$_uri = trim(explode( '?', $_uri )[0], '/');
return basename($_uri);
}//func
/**
* 生成指定长度的随机数
*默认情况下字符集为[数字,大小写英文字母]
*
*@author Lucifer-v
*@date 2015/09/12 00:12
*@scenario 生成salt
*
*@param int _len 生成随机字符串的长度
*@param string _dict 自己提供字典
*@return string
*/
function getRandStr($_len, $_dict = null){
$rand = "";
//如果给定了字典
if( null != $_dict ){
for($i=0, $size=strlen($_dict); $i
$rand .= $_dict[mt_rand(0, $size-1)];
}
return $rand;
}//if
//默认情况
for($i=0; $i
switch( mt_rand(0, 2) ){
case 0 : $rand .= chr(rand(48, 57) ); break;
case 1 : $rand .= chr(rand(65, 90)); break;
case 2 : $rand .= chr(rand(97, 112)); break;
}//switch
}//for
return $rand;
}//func
/*
*将给定的html文本中,指定的名字为_tag(包含开始标签和闭合标签)实体化
*
*@author Lucifer-v.
*@date 2015/09/12 18:25
*@lastmdate 2015/10/04 22:19
*@apply 防止XSS攻击
*
*@param string 待替换的HTML字符串
*@param string 待替换的标签名字
*@return 替换以后的HTML字符串
**/
function entitifyTags( $_html, $_tags ){
foreach( $_tags as $tag ){
//起始标签(单标签)|闭合标签
$pattern = "/(]*>|]*)/isU";
$_html = preg_replace_callback($pattern, function($_matches){
return htmlspecialchars($_matches[1]);
} ,$_html);
};
return $_html;
}//func
/**
*生成一个36个字节的GUID
*
*@author unknown
*@date unknown
*@menderlucifer-v.
*@lastmdate 2015/10/04
*
*@param boolean _lowercase 默认为false,如果为true,则返回大写的GUID
*@return string 返回36字节长的GUID字符串
*/
function createGuid( $_lowercase = false ) {
$charid = strtoupper(md5(uniqid(mt_rand(), true)));
$hyphen = chr(45);// "-"
$uuid = substr($charid, 0, 8).$hyphen
.substr($charid, 8, 4).$hyphen
.substr($charid,12, 4).$hyphen
.substr($charid,16, 4).$hyphen
.substr($charid,20,12);
return $_lowercase ? strtolower($uuid) : $uuid;
}//createGuid
########### 数组 #############
/**
*递归地对数组中的元素进行HTML实体转义
*
*@data 2015/10/09 11:35
*@note 函数不可重入
*@scenario 对$_POST和$_GET整体操作
*/
function rHtmlspecialchars( &$_ary ){
if( !is_array($_ary) ) return;//输入非法
foreach( $_ary as $key => &$val ){
if( is_array($val) ){//如果元素是数组,递归
rHtmlspecialchars($val);
}else{
$_ary[$key] = htmlspecialchars($val);
}
}//foreach
}//rHtmlspecialchars
/**
*递归地删除属组元素值两边的空白
*
*@data 2015/10/06 22:01
*@note 函数不可重入
*@scenario 对$_POST和$_GET整体操作
*/
function recurTrim( &$_ary ){
if( !is_array($_ary) ) return;//输入非法
foreach( $_ary as $key => &$val ){
if( is_array($val) ){//如果元素是数组,递归
recurTrim($val);
}else{
$_ary[$key] = trim($val);
}
}//foreach
}//recurTrim
/**
*从给定的数组中滤出[指定键值对]的数组元素,内部的值比较使用恒等
*
*@date 2015/10/08 20:33
*@scenario 需要对某些字段的值拿出来单独处理,单独命名的情况
* 例如: 分离join查询出来的数据
*@note 函数不可重入,执行成功后_ary里面是剩下的数组
*
*@param array &_ary
*@param array _kv 指定需要滤出并返回的键值对,形式: $_kv =array( 'field','value' )
*@return array 被滤出的元素集合
**/
function filterByField( &$_ary, $_kv ){
$retAry = array();
$remainsAry = array();
list($key, $val) = $_kv;
foreach( $_ary as $index => $ele ){
if( $ele[$key] === $val ){
$retAry[] = $ele;
continue;
}
$remainsAry[] = $ele;
}//foreach
$_ary = $remainsAry;
return $retAry;
}//func
/**
*给定一维属组,依据给定[字段的实际值]
*将元素分割为若干个分组,子分组以字段值为键
*
*@date 2015/10/07 10:21
*@note 此函数可重入
*@scenario 对学生数据进行分班操作
*
*@param array _ary 待分组的数组
*@param array _field 据以分组的字段
*@return array 已分好组的二维属组
*/
function groupByField( $_ary, $_field ){
static $retAry = array();
foreach( $_ary as $ele ){//执行分组操作
$retAry[$ele[$_field]][] = $ele;
}
return $retAry;
}//func
/**
* 数组重排
* 将给定参数中的数组元素进行重排, 拥有相同键名的元素,以索引数组的形式
* 组织到一起, 之前的键名作为此索引属组的键名
* 适用于'数组'参数列表
*
*@date 2015/10/07 11:44
*@lastmdate 2015/01/15 8:19
*
*scenario ECSHOP中收集货品库存表单数据时会用到
*@param array [...] 可变参数
*@return array 经过重排的数组
**/
function aryRearrange( ){
$retAry = array();
foreach( func_get_args() as $arg ){
if( empty($arg) || !is_array($arg) ) continue;//跳过非数组元素
foreach( $arg as $key => $val ){//逐个处理
$retAry[$key][] = $val;
}
}//foreach
return $retAry;
}//argRearrange
/**
* 数组重排
* 将给定参数中的数组元素进行重排, 拥有相同键名的元素,以索引数组的形式
* 组织到一起, 之前的键名作为此索引属组的键名
* 适用于二维数组作为参数
*
*@date 2015/01/15 8:19
*
*scenario ECSHOP中收集货品库存表单数据时会用到
*@param array _argAry 参数数组
*@return array 经过重排的数组
**/
function aryRearrangeUncert( $_argAry ){
$retAry = array();
foreach( $_argAry as $arg ){
if( empty($arg) || !is_array($arg) ) continue;//跳过非数组元素
foreach( $arg as $key => $val ){//逐个处理
$retAry[$key][] = $val;
}
}
return $retAry;
}//func
tools。php,phpTools/tools.php at master · superve/phpTools · GitHub相关推荐
- 请确保您已登录客户机操作系统。在客户机中装载CD驱动器启动终端,使用tar解压缩安装程序,然后执行vmware-insall.pl安装VMware Tools。
解决Ubuntu安装VM Tools请确保您已登录客户机操作系统.在客户机中装载CD驱动器启动终端,使用tar解压缩安装程序,然后执行vmware-insall.pl安装VMware Tools._w ...
- 安装VMtools:请确保您已登录客户机操作系统。在客户机中装载CD驱动器启动终端,使用tar解压缩安装程序,然后执行vmware-insall.pl安装VMware Tools。
这里写安装VMtools:请确保您已登录客户机操作系统.在客户机中装载CD驱动器启动终端,使用tar解压缩安装程序,然后执行vmware-insall.pl安装VMware Tools.[万能办法超详 ...
- android tools ignore,android 中tools:ignore=UselessParent这个属性的含义是什么?
满意答案 zjpx456 2018.03.05 采纳率:53% 等级:12 已帮助:7021人 这个属性是给lint检查工具看的,这个告诉IDE 以避免显示这样一条消息: "此 Rel ...
- UNITY 打包时提示sdk tools 或 sdk build tools版本低时可以直接点update 按钮进行更新...
UNITY 打包时提示sdk tools 或 sdk build tools版本低时可以直接点update 按钮进行更新 如题.如果不更新,而选择 : use newest version insta ...
- android sdk build tools 版本,SDK Build Tools 版本说明
Android SDK Build-Tools 是构建 Android 应用所需的一个 Android SDK 组件,安装在 /build-tools/ 目录中. 您应始终让 Build Tools ...
- Android sdk platform,sdk tools,sdk Build tools,sdk platform tools 的关系
1. sdk platform 简单理解为系统版本 最新级别: 28:Android 9 27:Android 8.1 26:Android 8.0 25:Android 7.1 24:Android ...
- c语言编写虚拟光驱软件下载,daemon tools lite下载-DAEMON Tools Lite v10.14.0.1747 免费版 - 下载吧...
DAEMON Tools Lite是一个非常流行的虚拟光驱工具,支持Windows7系统.DAEMON Tools Lite是一个先进的模拟备份并且合并保护盘的软件,可以备份SafeDisc保护的软件 ...
- VMware没有装Tools和装上Tools的区别(图示详解)
上次博主讲了,怎么安装Tools,这次我们就讲讲装Tools和没装Tools的区别,没装Tools和装上Tools的最大区别在于界面的美观程度,这里我们还是以Windows 7x64为例为大家进行演示 ...
- Kali安装VMware Tools,解决“安装VMware Tools”灰色按钮问题
这里写自定义目录标题 Kali安装VMware Tools,解决"安装VMware Tools"灰色按钮问题 点击虚拟机-->选择"安装VMware Tools&q ...
最新文章
- 使用Vant框架的组件van-pull-refresh搭配van-list和van-card完成上滑加载更多列表数据,下拉刷新当前列表数据(等同于翻页功能)
- Linux基础知识汇总(2)...持续更新中
- DataGridView设置单元格的提示内容ToolTip详解
- html转换pdf软件,html转换成高质量的PDF文件[跨平台开源软件]
- Team photo的新api
- 小米某员工向供应商索要大额好处费 已被公安拘捕
- Python库:Python OS库
- 【安卓笔记】—— 页面导航 Navigation(2)
- 核方法(kernel method)的主要思想
- angular 强制更新视图_angular,vue,react数据双向绑定原理分析
- librdkafka
- DllMain函数参数简介
- 什么是本地化部署、IaaS、PaaS、SaaS、DaaS?
- 搅拌站特征码序列号_芝奇的特征码与颗粒的命名规则
- JPA中Specification方法
- PDF文档分割简单方法
- 【二】头歌平台实验-离散数学逻辑与推理
- 移动魔百盒CM201-2(emmc和nand)-分省模式-免拆机-强刷包及教程
- Linux中查看压缩包的内容,linux中肿么查看压缩包中的内容
- 根据mask绘制contour ,bounding box。批量展示图片 等工具函数
热门文章
- Windows server 2003 R2之三:通过域对统一部署客户端软件
- 现实世界的 Windows Azure:HRG将应用程序扩展到移动设备,削减80 %的启动成本
- 国内第一本律师撰写的海关法律专业书籍-《企业如何应对海关行政处罚》-第五章...
- [转]linux下fms2流媒体服务器搭建之五-----flv播放器制作篇
- 基于Protobuf共享字段的分包和透传零拷贝技术,你了解吗?
- Java Web开发API Boy如何进阶?
- (一)深入浅出图解Git,入门到精通(保姆级教程)
- 面试官:说说你知道的几种负载均衡分类
- 五年程序员败在阿里三面,还是Java底层原理的问题啊!
- shiro处理ajax请求未登录,shiro处理ajax请求session失效跳转