$v) { $keysValue[$k] = $v[$keys]; } $type == 'asc' ? asort($keysValue) : arsort($keysValue); reset($keysValue); foreach ($keysValue as $k => $v) { $newArray[$k] = $arr[$k]; } return $newArray; } public static function arraySorts($arr, $keys, $type = 'asc') { if (count($arr) <= 1) { return $arr; } $keysValue = []; $newArray = []; foreach ($arr as $k => $v) { $keysValue[$k] = $v[$keys]; } $type == 'asc' ? asort($keysValue) : arsort($keysValue); reset($keysValue); foreach ($keysValue as $k => $v) { $newArray[] = $arr[$k]; } return $newArray; } /** * 获取数组指定的字段为key * * @param array $arr 数组 * @param string $field 要成为key的字段名 * @return array */ public static function arrayKey($arr, $field) { $newArray = []; if (empty($arr)) { return $newArray; } foreach ($arr as $value) { isset($value[$field]) && $newArray[$value[$field]] = $value; } return $newArray; } /** * 移除数组内某个key的值为传递的值 * * @param array $array * @param $value * @param string $key * @return array */ public static function removeByValue(array $array, $value, $key = 'id') { foreach ($array as $index => $item) { if ($item[$key] == $value) { unset($array[$index]); } } return $array; } /** * 获取数字区间 * * @param int $start * @param int $end * @return array */ public static function numBetween($start = 0, $end = 1, $key = true, $step_number = 1) { $arr = []; for ($i = $start; $i <= $end; $i = $i + $step_number) { $key == true ? $arr[$i] = $i : $arr[] = $i; } return $arr; } /** * 根据级别和数组返回字符串 * * @param int $level 级别 * @param array $models * @param $k * @param int $treeStat 开始计算 * @return bool|string */ public static function itemsLevel($level, array $models, $k, $treeStat = 1) { $str = ''; for ($i = 1; $i < $level; $i++) { $str .= '  '; if ($i == $level - $treeStat) { if (isset($models[$k + 1])) { return $str . "├──"; } return $str . "└──"; } } return false; } /** * 必须经过递归才能进行重组为下拉框 * * @param $models * @param string $idField * @param string $titleField * @param int $treeStat * @return array */ public static function itemsMergeDropDown($models, $idField = 'id', $titleField = 'title', $treeStat = 1) { $arr = []; foreach ($models as $k => $model) { $arr[] = [ $idField => $model[$idField], $titleField => self::itemsLevel($model['level'], $models, $k, $treeStat) . " " . $model[$titleField], ]; if (!empty($model['-'])) { $arr = ArrayHelper::merge( $arr, self::itemsMergeDropDown($model['-'], $idField, $titleField, $treeStat) ); } } return $arr; } /** * 匹配ip在ip数组内支持通配符 * * @param $ip * @param $allowedIPs * @return bool */ public static function ipInArray($ip, $allowedIPs) { foreach ($allowedIPs as $filter) { if ($filter === '*' || $filter === $ip || (($pos = strpos($filter, '*')) !== false && !strncmp($ip, $filter, $pos))) { return true; } } return false; } /** * 对比2组id,返回存在的id和被删除的id * * @param array $oldIds * @param array $newIds * @return array */ public static function comparisonIds(array $oldIds, array $newIds) { $updatedIds = $deleteIds = []; foreach ($oldIds as $oldId) { if (in_array($oldId, $newIds)) { $updatedIds[] = $oldId; } else { $deleteIds[] = $oldId; } } return [$updatedIds, $deleteIds]; } /** * 获取递归的第一个没有子级的数据 * * @param $array * @return mixed */ public static function getFirstRowByItemsMerge(array $array) { foreach ($array as $item) { if (!empty($item['-'])) { return self::getFirstRowByItemsMerge($item['-']); } else { return $item; } } return false; } /** * 获取所有没有子级的数据 * * @param $array * @return mixed */ public static function getNotChildRowsByItemsMerge(array $array) { $arr = []; foreach ($array as $item) { if (!empty($item['-'])) { $arr = array_merge($arr, self::getNotChildRowsByItemsMerge($item['-'])); } else { $arr[] = $item; } } return $arr; } /** * 递归转普通二维数组 * * @param $array * @return mixed */ public static function getRowsByItemsMerge(array $array, $childField = '-') { $arr = []; foreach ($array as $item) { if (!empty($item[$childField])) { $arr = array_merge($arr, self::getRowsByItemsMerge($item[$childField])); } unset($item[$childField]); $arr[] = $item; } return $arr; } /** * 重组 map 类型转为正常的数组 * * @param array $array * @param string $keyForField * @param string $valueForField * @return array */ public static function regroupMapToArr($array = [], $keyForField = 'route', $valueForField = 'title') { $arr = []; foreach ($array as $key => $item) { if (!is_array($array[$key])) { $arr[] = [ $keyForField => $key, $valueForField => $item, ]; } else { $arr[] = $item; } } return $arr; } /** * 数组内某字段转数组 * * @param array $data * @param string $field * @return array */ public static function fieldToArray(array $data, $field = 'covers') { foreach ($data as &$datum) { if (empty($datum[$field])) { $datum[$field] = []; } if (!is_array($datum[$field])) { $datum[$field] = Json::decode($datum[$field]); } } return $data; } /** * 数组转xml * * * @param $arr * 微信回调成功:['return_code' => 'SUCCESS', 'return_msg' => 'OK'] * 微信回调失败:['return_code' => 'FAIL', 'return_msg' => 'OK'] * @return bool|string */ public static function toXml($arr) { if (!is_array($arr) || count($arr) <= 0) { return false; } $xml = ""; foreach ($arr as $key => $val) { if (is_numeric($val)) { $xml .= "<" . $key . ">" . $val . ""; } else { $xml .= "<" . $key . ">"; } } $xml .= ""; return $xml; } public static function get_client_ip() { if (!empty($_SERVER['REMOTE_ADDR'])) { $ip = $_SERVER['REMOTE_ADDR']; } else { // for php-cli(phpunit etc.) $ip = defined('PHPUNIT_RUNNING') ? '127.0.0.1' : gethostbyname(gethostname()); } return filter_var($ip, FILTER_VALIDATE_IP) ?: '127.0.0.1'; } /** * 排列组合 * 采用二进制方法进行组合的选择,如表示5选3时,只需有3位为1就可以了,所以可得到的组合是 01101 11100 00111 10011 01110等10种组合 * * @param array $arr 需要排列的数组 * @param integer $min_size 最小个数 * @return array 满足条件的新数组组合 */ public static function pl($arr, $size = 5) { $len = count($arr); $max = pow(2, $len); $min = pow(2, $size) - 1; $r_arr = array(); for ($i = $min; $i < $max; $i++) { $count = 0; $t_arr = array(); for ($j = 0; $j < $len; $j++) { $a = pow(2, $j); $t = $i & $a; if ($t == $a) { $t_arr[] = $arr[$j]; $count++; } } if ($count == $size) { $r_arr[] = $t_arr; } } return $r_arr; } /** * N个数组的笛卡尔集 * @Author bing * @DateTime 2021-09-03 15:06:19 * @copyright: Copyright (c) 2020 广东七件事集团 * @return array */ public static function combineDika() { $data = func_get_args(); $data = current($data); $result = array(); $arr1 = array_shift($data); foreach ($arr1 as $key => $item) { $result[] = array($item); } foreach ($data as $key => $item) { $result = self::combineArray($result, $item); } return $result; } /** * 两个数组的笛卡尔积 * @Author bing * @DateTime 2021-09-03 15:07:11 * @copyright: Copyright (c) 2020 广东七件事集团 * @param [type] $arr1 * @param [type] $arr2 * @return array */ public static function combineArray($arr1, $arr2) { $result = array(); foreach ($arr1 as $item1) { foreach ($arr2 as $item2) { $temp = $item1; $temp[] = $item2; $result[] = $temp; } } return $result; } /** * 二维数组组合为树形结构 * @Author: lun * @DateTime: 2023/8/4 0004 10:13 * @Copyright: copyright (c) 2021 广东七件事集团 * @param array $arrays 数组 * @param string $idField 子字段 * @param string $pidField 父字段 * @param string $child 组合的子参数字段 * @return array */ public static function buildTree($arrays, $idField = "id", $pidField = 'pid', $child = '-') { $tree = array(); $isset_key = []; foreach ($arrays as $item) { $tree[$item[$idField]] = $item; } foreach ($tree as $key => $item) { if ($item[$pidField] && isset($tree[$item[$pidField]])) { $isset_key[] = $key; $tree[$item[$pidField]][$child][] = &$tree[$key]; } } foreach ($tree as $key => $item) { if (in_array($key, $isset_key)) unset($tree[$key]); if ($item[$pidField] && isset($tree[$item[$pidField]])) { unset($tree[$key]); } } return $tree; } /** * 去除重复项 * @param array $list * @param $field * @return array */ public static function removeDuplicates($list, $field) { if (!empty($list)) { $tmp = []; $list = (array) $list; foreach ($list as $key => $item) { if (is_array($item) && isset($item[$field])) { if (in_array($item[$field], $tmp)) { unset($list[$key]); } else { $tmp[] = $item[$field]; } } } } return $list; } /** * 数组查找 * * @param array $array * @param \Closure $callback * @return mixed */ public static function find(array $array, \Closure $callback) { $result = array_filter($array, $callback); return reset($result); // 返回匹配到的第一个元素 } }