Arrays.php 3.1 KB

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