80 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			80 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace fast;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * 版本检测和对比
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								class Version
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 检测版本是否的版本要求的数据中
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @param string $version
							 | 
						||
| 
								 | 
							
								     * @param array  $data
							 | 
						||
| 
								 | 
							
								     * @return bool
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function check($version, $data = [])
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        //版本号以.分隔
							 | 
						||
| 
								 | 
							
								        $data = is_array($data) ? $data : [$data];
							 | 
						||
| 
								 | 
							
								        if ($data) {
							 | 
						||
| 
								 | 
							
								            if (in_array("*", $data) || in_array($version, $data)) {
							 | 
						||
| 
								 | 
							
								                return true;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            $ver = explode('.', $version);
							 | 
						||
| 
								 | 
							
								            if ($ver) {
							 | 
						||
| 
								 | 
							
								                $versize = count($ver);
							 | 
						||
| 
								 | 
							
								                //验证允许的版本
							 | 
						||
| 
								 | 
							
								                foreach ($data as $m) {
							 | 
						||
| 
								 | 
							
								                    $c = explode('.', $m);
							 | 
						||
| 
								 | 
							
								                    if (!$c || $versize != count($c)) {
							 | 
						||
| 
								 | 
							
								                        continue;
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                    $i = 0;
							 | 
						||
| 
								 | 
							
								                    foreach ($c as $a => $k) {
							 | 
						||
| 
								 | 
							
								                        if (!self::compare($ver[$a], $k)) {
							 | 
						||
| 
								 | 
							
								                            continue 2;
							 | 
						||
| 
								 | 
							
								                        } else {
							 | 
						||
| 
								 | 
							
								                            $i++;
							 | 
						||
| 
								 | 
							
								                        }
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                    if ($i == $versize) {
							 | 
						||
| 
								 | 
							
								                        return true;
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return false;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 比较两个版本号
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @param string $v1
							 | 
						||
| 
								 | 
							
								     * @param string $v2
							 | 
						||
| 
								 | 
							
								     * @return boolean
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public static function compare($v1, $v2)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if ($v2 == "*" || $v1 == $v2) {
							 | 
						||
| 
								 | 
							
								            return true;
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            $values = [];
							 | 
						||
| 
								 | 
							
								            $k = explode(',', $v2);
							 | 
						||
| 
								 | 
							
								            foreach ($k as $v) {
							 | 
						||
| 
								 | 
							
								                if (strpos($v, '-') !== false) {
							 | 
						||
| 
								 | 
							
								                    list($start, $stop) = explode('-', $v);
							 | 
						||
| 
								 | 
							
								                    for ($i = $start; $i <= $stop; $i++) {
							 | 
						||
| 
								 | 
							
								                        $values[] = $i;
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                } else {
							 | 
						||
| 
								 | 
							
								                    $values[] = $v;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            return in_array($v1, $values) ? true : false;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |