Version.php 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. <?php
  2. namespace fast;
  3. /**
  4. * 版本检测和对比
  5. */
  6. class Version
  7. {
  8. /**
  9. * 检测版本是否的版本要求的数据中
  10. *
  11. * @param string $version
  12. * @param array $data
  13. */
  14. public static function check($version, $data = [])
  15. {
  16. //版本号以.分隔
  17. $data = is_array($data) ? $data : [$data];
  18. if ($data)
  19. {
  20. if (in_array("*", $data) || in_array($version, $data))
  21. {
  22. return TRUE;
  23. }
  24. $ver = explode('.', $version);
  25. if ($ver)
  26. {
  27. $versize = count($ver);
  28. //验证允许的版本
  29. foreach ($data as $m)
  30. {
  31. $c = explode('.', $m);
  32. if (!$c || $versize != count($c))
  33. continue;
  34. $i = 0;
  35. foreach ($c as $a => $k)
  36. {
  37. if (!self::compare($ver[$a], $k))
  38. {
  39. continue 2;
  40. }
  41. else
  42. {
  43. $i++;
  44. }
  45. }
  46. if ($i == $versize)
  47. return TRUE;
  48. }
  49. }
  50. }
  51. return FALSE;
  52. }
  53. /**
  54. * 比较两个版本号
  55. *
  56. * @param string $v1
  57. * @param string $v2
  58. * @return boolean
  59. */
  60. public static function compare($v1, $v2)
  61. {
  62. if ($v2 == "*" || $v1 == $v2)
  63. {
  64. return TRUE;
  65. }
  66. else
  67. {
  68. $values = [];
  69. $k = explode(',', $v2);
  70. foreach ($k as $v)
  71. {
  72. if (strpos($v, '-') !== FALSE)
  73. {
  74. list($start, $stop) = explode('-', $v);
  75. for ($i = $start; $i <= $stop; $i++)
  76. {
  77. $values[] = $i;
  78. }
  79. }
  80. else
  81. {
  82. $values[] = $v;
  83. }
  84. }
  85. return in_array($v1, $values) ? TRUE : FALSE;
  86. }
  87. }
  88. }