Arrays.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. <?php
  2. namespace Qii\Config;
  3. /**
  4. * 实现PHP中数组功能
  5. *
  6. * 用法:
  7. *
  8. * $array = new \Qii\Config\Arrays();
  9. *
  10. * $data = array();
  11. * $data['common']['one'] = '1';
  12. * $data['common']['two'] = '1';
  13. * $data['common']['three'] = '1';
  14. *
  15. * $array->getValueFromArray($data, '[common][three]');
  16. * $array->setPrivate('string', 'string');
  17. * $array->setPrivate('array[val][]', array(1, 2));
  18. * $array->setPrivate('array[val][]', array(3, 4));
  19. *
  20. * $array->getPrivate('string');
  21. *
  22. * $array->getPrivate('array[val]');
  23. * $array->set('string', 'string');
  24. * $array->set('array[val][]', array(1, 2));
  25. * $array->set('array[val][]', array(3, 4));
  26. *
  27. * $array->get('string');
  28. *
  29. * $array->get('array[val]');
  30. *
  31. * $array->get('array[val][0]');
  32. *
  33. * $array->get('array[val][1]');
  34. *
  35. *
  36. */
  37. class Arrays
  38. {
  39. const VERSION = '1.2';
  40. protected $_private = array();
  41. public function __construct()
  42. {
  43. }
  44. public function __toString()
  45. {
  46. return self::VERSION;
  47. }
  48. /**
  49. * 直接从数组中获取指定key的值
  50. *
  51. * @param Array $data
  52. * @param String $key
  53. * @return Mix
  54. */
  55. public function getValueFromArray($data, $key)
  56. {
  57. if (preg_match('/^\s*$/', $key)) {
  58. return $data;
  59. }
  60. preg_match_all("/(.*?)\[(.*?)\]/", $key, $match);
  61. $name = $match[1][0];
  62. $keys = $match[2];
  63. if ($name == '') {
  64. return isset($data[$key]) ? $data[$key] : '';
  65. }
  66. if (!isset($data[$name])) {
  67. return '';
  68. }
  69. $value = $data[$name];
  70. foreach ($keys AS $key) {
  71. if ($key == '') {
  72. $value = $value;
  73. } else {
  74. $value = $value[$key];
  75. }
  76. }
  77. return $value;
  78. }
  79. /**
  80. * 实现PHP数组赋值
  81. *
  82. * @param String $key
  83. * @param Mix $value
  84. * @return Array
  85. */
  86. public function set($key, $value)
  87. {
  88. preg_match_all("/(.*?)\[(.*?)\]/", $key, $match);
  89. $name = '';
  90. if (isset($match[1]) && isset($match[1][0])) {
  91. $name = $match[1][0];
  92. }
  93. $keys = $match[2];
  94. if ($name == '') {
  95. $name = $key;
  96. }
  97. if (empty($keys)) {
  98. $this->_private[$key] = $value;
  99. return $this->_private;
  100. }
  101. $private = array();
  102. $private = array_merge($private, $keys);
  103. $privates = null;
  104. if (is_array($value) || is_object($value)) {
  105. $array = str_replace('[\'\']', '[]', '$privates[\'' . join("']['", $private) . '\']=$value;');
  106. } else {
  107. $array = str_replace('[\'\']', '[]', '$privates[\'' . join("']['", $private) . '\']=\'' . $value . '\';');
  108. }
  109. eval($array);
  110. if (isset($this->_private[$name])) {
  111. if (!is_array($this->_private[$name])) {
  112. unset($this->_private[$name]);
  113. $this->_private[$name] = $privates;
  114. } else {
  115. $this->_private[$name] = array_merge_recursive($this->_private[$name], $privates);
  116. }
  117. } else {
  118. $this->_private[$name] = $privates;
  119. }
  120. return $this->_private;
  121. }
  122. /**
  123. * 实现PHP数组赋值
  124. *
  125. * @param String $key
  126. * @param Mix $value
  127. * @return Array
  128. */
  129. public function setPrivate($key, $value)
  130. {
  131. return $this->set($key, $value);
  132. }
  133. /**
  134. * 获取通过setPrivate key对应的值
  135. *
  136. * @param String $key
  137. * @return Mix
  138. */
  139. public function get($key)
  140. {
  141. if (preg_match('/^\s*$/', $key)) {
  142. return $this->_private;
  143. }
  144. preg_match_all("/(.*?)\[(.*?)\]/", $key, $match);
  145. $name = '';
  146. if (isset($match[1]) && isset($match[1][0])) {
  147. $name = $match[1][0];
  148. }
  149. $keys = $match[2];
  150. if ($name == '') {
  151. return isset($this->_private[$key]) ? $this->_private[$key] : '';
  152. }
  153. if (!isset($this->_private[$name])) {
  154. return '';
  155. }
  156. $value = $this->_private[$name];
  157. foreach ($keys AS $key) {
  158. if ($key == '') {
  159. $value = $value;
  160. } else {
  161. $value = $value[$key];
  162. }
  163. }
  164. return $value;
  165. }
  166. /**
  167. * 获取通过setPrivate key对应的值
  168. *
  169. * @param String $key
  170. * @return Mix
  171. */
  172. public function getPrivate($key) {
  173. return $this->get($key);
  174. }
  175. }