Arr.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. <?php
  2. /* file: 数组处理类
  3. Created by wanghong<1204772286@qq.com>
  4. Date: 2021-02-23 */
  5. namespace utils;
  6. class Arr{
  7. /**
  8. * 节点遍历
  9. * @param array $list 遍历的数组
  10. * @param string $pk 主键id
  11. * @param string $pid 父id
  12. * @param string $child 子数组
  13. * @param int $root 判断是否存在parent
  14. * @return array
  15. **/
  16. public static function listToTree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root = 0)
  17. {
  18. // 创建Tree
  19. $tree = [];
  20. if (is_array($list)) {
  21. // 创建基于主键的数组引用
  22. $refer = [];
  23. foreach ($list as $key => $data) {
  24. $refer[$data[$pk]] =& $list[$key];
  25. }
  26. foreach ($list as $key => $data) {
  27. // 判断是否存在parent
  28. $parentId = $data[$pid];
  29. if ($root == $parentId) {
  30. $tree[] =& $list[$key];
  31. } else {
  32. if (isset($refer[$parentId])) {
  33. $parent =& $refer[$parentId];
  34. $parent[$child][] =& $list[$key];
  35. }else {
  36. $tree[] =& $list[$key];
  37. }
  38. }
  39. }
  40. }
  41. return $tree;
  42. }
  43. /**
  44. * 删除重复的二维数组
  45. * $array 需要操作的数组
  46. * $field 根据字段进行对比
  47. * return array
  48. */
  49. public static function remove_duplicate($array, $field)
  50. {
  51. $result = array();
  52. foreach ($array as $key => $value) {
  53. $has = false;
  54. foreach ($result as $val) {
  55. if ($val[$field] == $value[$field]) {
  56. $has = true;
  57. break;
  58. }
  59. }
  60. if (!$has) {
  61. $result[] = $value;
  62. }
  63. }
  64. return $result;
  65. }
  66. /**
  67. * 二维数组取最大值
  68. * $array 操作的数组
  69. * $field 取某个字段的最大值
  70. * $returnArr 返回最大的值(默认)或者最大值所在的数组
  71. */
  72. public static function get_array_max($array, $field, $returnArr = false)
  73. {
  74. if(!$array){
  75. return 0;
  76. }
  77. foreach ($array as $k => $v) {
  78. $temp[] = $v[$field];
  79. }
  80. if ($returnArr) {
  81. $max = max($temp);
  82. foreach ($array as $k => $v) {
  83. if ($v[$field] == $max) {
  84. return $v;
  85. break;
  86. }
  87. }
  88. } else {
  89. return max($temp);
  90. }
  91. }
  92. /*
  93. * 二维数组排序
  94. * $arrays 需要排序的数组
  95. * $sort_key 需要排序的字段
  96. * $sort_order 正序(默认)还是倒序
  97. * $sort_type 排序的类型:数字(默认),字母
  98. * return $array
  99. */
  100. public static function sort_array($arrays, $sort_key, $sort_order = SORT_ASC, $sort_type = SORT_NUMERIC){
  101. if (is_array($arrays)) {
  102. foreach ($arrays as $array) {
  103. if (is_array($array)) {
  104. $key_arrays[] = $array[$sort_key];
  105. } else {
  106. return false;
  107. }
  108. }
  109. } else {
  110. return false;
  111. }
  112. array_multisort($key_arrays, $sort_order, $sort_type, $arrays);
  113. return $arrays;
  114. }
  115. /*
  116. * 查询二维数组中是否含有此值
  117. * $value 所需的值
  118. * $array 操作的数组
  119. * return boolean
  120. */
  121. public static function deep_in_array($value, $array)
  122. {
  123. foreach ($array as $item) {
  124. if (!is_array($item)) {
  125. if ($item == $value) {
  126. return true;
  127. } else {
  128. continue;
  129. }
  130. }
  131. if (in_array($value, $item)) {
  132. return true;
  133. } else if (deep_in_array($value, $item)) {
  134. return true;
  135. }
  136. }
  137. return false;
  138. }
  139. /**
  140. * 将相同值的二维数组重组一个新的三维数组
  141. * $field 需要放到一个数组的字段
  142. * $title 作为新数组的标题
  143. * $array 需要处理的数组
  144. * */
  145. //将相同值的二维数组重组一个新的数组。
  146. public static function recombine_array($field,$title,$array,$name='name',$list='dataList'){
  147. $data=[];
  148. foreach ($array as $k => $v) {
  149. $arr[]=$v[$field];
  150. $arr=array_unique($arr);
  151. $num=0;
  152. foreach($arr as $key=>$val){
  153. if($v[$field]==$val){
  154. $data[$num][$name] = $v[$title];
  155. $data[$num][$list][] = $v;
  156. }
  157. ++$num;
  158. }
  159. }
  160. return $data;
  161. }
  162. /*
  163. 将object转array
  164. $array 要转化的对象
  165. return array
  166. */
  167. public static function object_array($array)
  168. {
  169. if (is_object($array)) {
  170. $array = (array)$array;
  171. }
  172. if (is_array($array)) {
  173. foreach ($array as $key => $value) {
  174. $array[$key] = object_array($value);
  175. }
  176. }
  177. return $array;
  178. }
  179. /*
  180. json转array
  181. $json 要转化的json串
  182. return array
  183. */
  184. public static function json_to_array($json)
  185. {
  186. $array = json_decode($json);
  187. $arr = [];
  188. if ($array) {
  189. foreach ($array as $k => $v) {
  190. $arr[] = object_array($v);
  191. }
  192. }
  193. return $arr;
  194. }
  195. /*
  196. 数组中查找相应的值,只要出现一次即返回,否则返回false;
  197. $array 被查找的数组
  198. $name 要查找的字段
  199. $condition 匹配条件
  200. return array
  201. */
  202. public static function query_array($array, $name, $condition,$key='')
  203. {
  204. if (!is_array($array)) {
  205. return false;
  206. }
  207. foreach ($array as $item) {
  208. if ($item[$name] == $condition) {
  209. if($key){
  210. return $item[$key];
  211. }
  212. return $item;
  213. }
  214. }
  215. return false;
  216. }
  217. /*
  218. 在数组中查找相应的值,将查找到的结果集全部返回,如果没有找到,则返回false.
  219. $array 查找的数组
  220. $name 查找的字段
  221. $condition 匹配条件
  222. return array
  223. */
  224. public static function query_array_all($array, $name, $condition)
  225. {
  226. if (!is_array($array)) {
  227. return false;
  228. }
  229. $returnArray = array();
  230. foreach ($array as $item) {
  231. if ($item[$name] == $condition) {
  232. $returnArray[] = $item;
  233. }
  234. }
  235. if (count($returnArray) > 0) {
  236. return $returnArray;
  237. } else {
  238. return false;
  239. }
  240. }
  241. /*
  242. 获取两个数字之间的值,形成一个新的数组
  243. $from 起始值
  244. $to 终止值
  245. $step -int 步长
  246. $str -string 数字结尾处拼接的字符串
  247. return array
  248. */
  249. public static function array_range($from, $to, $step=1,$str=''){
  250. $array = array();
  251. for ($x=$from; $x <= $to; $x += $step){
  252. $array[] = $x.$str;
  253. }
  254. return $array;
  255. }
  256. //数组中获取ID字符串
  257. public static function arrayToString($array, $field, $isStr = true)
  258. {
  259. $idArr = [];
  260. foreach ($array as $k => $v) {
  261. if(is_array($field)){
  262. foreach($field as $val){
  263. $idArr[]=$v[$val];
  264. }
  265. }else{
  266. $idArr[] = $v[$field];
  267. }
  268. }
  269. if ($isStr) {
  270. $idStr = implode(',', $idArr);
  271. return $idStr;
  272. } else {
  273. return $idArr;
  274. }
  275. }
  276. /**
  277. * 用数组中某个字段的值 作为数组的键
  278. * @param array $arr 需要处理的数组
  279. * @param string $keyValue 作为键的值
  280. * @return array
  281. */
  282. public static function array_value_key($arr, $keyValue)
  283. {
  284. $temp = [];
  285. foreach ($arr as $item) {
  286. if (isset($item[$keyValue])){
  287. $temp[$item[$keyValue]] = $item;
  288. }
  289. }
  290. return $temp;
  291. }
  292. }