PageRenderTime 43ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/wind/utility/WindUtility.php

https://github.com/cuijinquan/nextwind
PHP | 185 lines | 75 code | 7 blank | 103 comment | 10 complexity | 348b1e981cb03dc4992c4995723330f3 MD5 | raw file
  1. <?php
  2. /**
  3. * 通用工具库
  4. *
  5. * @author Qiong Wu <papa0924@gmail.com>
  6. * @copyright ©2003-2103 phpwind.com
  7. * @license http://www.windframework.com
  8. * @version $Id: WindUtility.php 3859 2012-12-18 09:25:51Z yishuo $
  9. * @package utility
  10. */
  11. class WindUtility {
  12. /**
  13. * 解析表达式
  14. *
  15. * 表达式格式: namespace:arg1.arg2.arg3.arg4.arg5==value
  16. * 返回: array($namespace, $param1, $operator, $param1)
  17. *
  18. * @param string $expression
  19. * 待解析的表达式
  20. * @return array 返回解析后的表达式,由表达式的各项组成的数组:
  21. * <ul>
  22. * <li>第一个元素: 命名空间</li>
  23. * <li>第二个元素: 表达式的左边操作数</li>
  24. * <li>第三个元素: 表达式的操作符</li>
  25. * <li>第四个元素: 表达式的右边操作数</li>
  26. * </ul>
  27. */
  28. public static function resolveExpression($expression) {
  29. $operators = array('==', '!=', '<', '>', '<=', '>=');
  30. $operatorsReplace = array('#==#', '#!=#', '#<#', '#>#', '#<=#', '#>=#');
  31. list($p, $o, $v2) = explode('#', str_replace($operators, $operatorsReplace, $expression));
  32. if (strpos($p, ":") !== false)
  33. list($_namespace, $p) = explode(':', trim($p, ':'));
  34. else
  35. $_namespace = '';
  36. return array($_namespace, $p, $o, $v2);
  37. }
  38. /**
  39. * 执行简单的条件表达式
  40. *
  41. * 只能执行==、!=、<、>、<=、>=简单的比较
  42. *
  43. * @param string $v1
  44. * 左边的操作数
  45. * @param string $v2
  46. * 右边的操作数
  47. * @param string $operator
  48. * 操作符号
  49. * @return boolean
  50. */
  51. public static function evalExpression($v1, $v2, $operator) {
  52. switch ($operator) {
  53. case '==':
  54. return $v1 == $v2;
  55. case '!=':
  56. return $v1 != $v2;
  57. case '<':
  58. return $v1 < $v2;
  59. case '>':
  60. return $v1 > $v2;
  61. case '<=':
  62. return $v1 <= $v2;
  63. case '>=':
  64. return $v1 >= $v2;
  65. default:
  66. return false;
  67. }
  68. return false;
  69. }
  70. /**
  71. * 递归合并两个数组
  72. *
  73. * @param array $array1
  74. * 数组1
  75. * @param array $array2
  76. * 数组2
  77. * @return array 合并后的数组
  78. */
  79. public static function mergeArray($array1, $array2) {
  80. foreach ($array2 as $key => $value) {
  81. if (!isset($array1[$key])) {
  82. $array1[$key] = $value;
  83. } elseif (is_array($array1[$key]) && is_array($value)) {
  84. $array1[$key] = self::mergeArray($array1[$key], $array2[$key]);
  85. } elseif (is_numeric($key) && $array1[$key] !== $array2[$key]) {
  86. $array1[] = $value;
  87. } else
  88. $array1[$key] = $value;
  89. }
  90. return $array1;
  91. }
  92. /**
  93. * 将字符串首字母小写
  94. *
  95. * @param string $str
  96. * 待处理的字符串
  97. * @return string 返回处理后的字符串
  98. */
  99. public static function lcfirst($str) {
  100. $str[0] = strtolower($str[0]);
  101. return $str;
  102. }
  103. /**
  104. * 获得随机数字符串
  105. *
  106. * @param int $length
  107. * 随机数的长度
  108. * @return string 随机获得的字串
  109. */
  110. public static function generateRandStr($length) {
  111. $mt_string = 'AzBy0CxDwEv1FuGtHs2IrJqK3pLoM4nNmOlP5kQjRi6ShTgU7fVeW8dXcY9bZa';
  112. $randstr = '';
  113. for ($i = 0; $i < $length; $i++) {
  114. $randstr .= $mt_string[mt_rand(0, 61)];
  115. }
  116. return $randstr;
  117. }
  118. /**
  119. * 通用组装测试验证规则
  120. *
  121. * @param string $field
  122. * 验证字段名称
  123. * @param string $validator
  124. * 验证方法
  125. * @param array $args
  126. * 验证方法中传递的其他参数,需在待验证字段值的后面,默认为空数组
  127. * @param string $default
  128. * 验证失败是设置的默认值,默认为null
  129. * @param string $message
  130. * 验证失败是返回的错误信息,默认为空字串
  131. * @return array 返回验证规则
  132. * <ul>
  133. * <li>field: 验证字段名称</li>
  134. * <li>validator: 验证方法</li>
  135. * <li>args: 验证方法中传递的其他参数,需在待验证字段值的后面,缺省为空数组</li>
  136. * <li>default: 验证失败是设置的默认值,缺省为null</li>
  137. * <li>message: 验证失败是返回的错误信息,默认为'提示:XX验证失败'</li>
  138. * </ul>
  139. */
  140. public static function buildValidateRule($field, $validator, $args = array(), $default = null, $message = '') {
  141. return array(
  142. 'field' => $field,
  143. 'validator' => $validator,
  144. 'args' => (array) $args,
  145. 'default' => $default,
  146. 'message' => ($message ? $message : '提示:\'' . $field . '\'验证失败'));
  147. }
  148. /**
  149. * 对字符串中的参数进行替换
  150. *
  151. * 该函优化了php strtr()实现, 在进行数组方式的字符替换时支持了两种模式的字符替换:
  152. *
  153. * @example <pre>
  154. * 1. echo WindUtility::strtr("I Love {you}",array('{you}' =>
  155. * 'lili'));
  156. * 结果: I Love lili
  157. * 2. echo WindUtility::strtr("I Love
  158. * #0,#1",array('lili','qiong'));
  159. * 结果: I Love lili,qiong
  160. * <pre>
  161. * @see WindLangResource::getMessage()
  162. * @param string $str
  163. * @param string $from
  164. * @param string $to
  165. * 可选参数,默认值为''
  166. * @return string
  167. */
  168. public static function strtr($str, $from, $to = '') {
  169. if (is_string($from)) return strtr($str, $from, $to);
  170. if (isset($from[0])) {
  171. foreach ($from as $key => $value) {
  172. $from['#' . $key] = $value;
  173. unset($from[$key]);
  174. }
  175. }
  176. return !empty($from) ? strtr($str, $from) : $str;
  177. }
  178. }