######### 数值操作扩展 #########

/**

*检测两个实数区间是否相交

*

*@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相关推荐

  1. 请确保您已登录客户机操作系统。在客户机中装载CD驱动器启动终端,使用tar解压缩安装程序,然后执行vmware-insall.pl安装VMware Tools。

    解决Ubuntu安装VM Tools请确保您已登录客户机操作系统.在客户机中装载CD驱动器启动终端,使用tar解压缩安装程序,然后执行vmware-insall.pl安装VMware Tools._w ...

  2. 安装VMtools:请确保您已登录客户机操作系统。在客户机中装载CD驱动器启动终端,使用tar解压缩安装程序,然后执行vmware-insall.pl安装VMware Tools。

    这里写安装VMtools:请确保您已登录客户机操作系统.在客户机中装载CD驱动器启动终端,使用tar解压缩安装程序,然后执行vmware-insall.pl安装VMware Tools.[万能办法超详 ...

  3. android tools ignore,android 中tools:ignore=UselessParent这个属性的含义是什么?

    满意答案 zjpx456 2018.03.05 采纳率:53%    等级:12 已帮助:7021人 这个属性是给lint检查工具看的,这个告诉IDE 以避免显示这样一条消息: "此 Rel ...

  4. UNITY 打包时提示sdk tools 或 sdk build tools版本低时可以直接点update 按钮进行更新...

    UNITY 打包时提示sdk tools 或 sdk build tools版本低时可以直接点update 按钮进行更新 如题.如果不更新,而选择 : use newest version insta ...

  5. android sdk build tools 版本,SDK Build Tools 版本说明

    Android SDK Build-Tools 是构建 Android 应用所需的一个 Android SDK 组件,安装在 /build-tools/ 目录中. 您应始终让 Build Tools ...

  6. 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 ...

  7. c语言编写虚拟光驱软件下载,daemon tools lite下载-DAEMON Tools Lite v10.14.0.1747 免费版 - 下载吧...

    DAEMON Tools Lite是一个非常流行的虚拟光驱工具,支持Windows7系统.DAEMON Tools Lite是一个先进的模拟备份并且合并保护盘的软件,可以备份SafeDisc保护的软件 ...

  8. VMware没有装Tools和装上Tools的区别(图示详解)

    上次博主讲了,怎么安装Tools,这次我们就讲讲装Tools和没装Tools的区别,没装Tools和装上Tools的最大区别在于界面的美观程度,这里我们还是以Windows 7x64为例为大家进行演示 ...

  9. Kali安装VMware Tools,解决“安装VMware Tools”灰色按钮问题

    这里写自定义目录标题 Kali安装VMware Tools,解决"安装VMware Tools"灰色按钮问题 点击虚拟机-->选择"安装VMware Tools&q ...

最新文章

  1. 使用Vant框架的组件van-pull-refresh搭配van-list和van-card完成上滑加载更多列表数据,下拉刷新当前列表数据(等同于翻页功能)
  2. Linux基础知识汇总(2)...持续更新中
  3. DataGridView设置单元格的提示内容ToolTip详解
  4. html转换pdf软件,html转换成高质量的PDF文件[跨平台开源软件]
  5. Team photo的新api
  6. 小米某员工向供应商索要大额好处费 已被公安拘捕
  7. Python库:Python OS库
  8. 【安卓笔记】—— 页面导航 Navigation(2)
  9. 核方法(kernel method)的主要思想
  10. angular 强制更新视图_angular,vue,react数据双向绑定原理分析
  11. librdkafka
  12. DllMain函数参数简介
  13. 什么是本地化部署、IaaS、PaaS、SaaS、DaaS?
  14. 搅拌站特征码序列号_芝奇的特征码与颗粒的命名规则
  15. JPA中Specification方法
  16. PDF文档分割简单方法
  17. 【二】头歌平台实验-离散数学逻辑与推理
  18. 移动魔百盒CM201-2(emmc和nand)-分省模式-免拆机-强刷包及教程
  19. Linux中查看压缩包的内容,linux中肿么查看压缩包中的内容
  20. 根据mask绘制contour ,bounding box。批量展示图片 等工具函数

热门文章

  1. Windows server 2003 R2之三:通过域对统一部署客户端软件
  2. 现实世界的 Windows Azure:HRG将应用程序扩展到移动设备,削减80 %的启动成本
  3. 国内第一本律师撰写的海关法律专业书籍-《企业如何应对海关行政处罚》-第五章...
  4. [转]linux下fms2流媒体服务器搭建之五-----flv播放器制作篇
  5. 基于Protobuf共享字段的分包和透传零拷贝技术,你了解吗?
  6. Java Web开发API Boy如何进阶?
  7. (一)深入浅出图解Git,入门到精通(保姆级教程)
  8. 面试官:说说你知道的几种负载均衡分类
  9. 五年程序员败在阿里三面,还是Java底层原理的问题啊!
  10. shiro处理ajax请求未登录,shiro处理ajax请求session失效跳转