以下都是使用tp5框架,本人封装的常用方法
1、数组系列
1.1、二维数组根据pid生成多维树 (注意:父级必须排在数组前面,降维的生成树方法)
/**
* 二维数组根据pid生成多维树
* @param $list 父子级拼接数组传入
* @param $pid 父级ID字段
* @param $child 子集
* @return array
*/
function listToTree($list, $pid = 'pid', $child = 'children')
{
$tree = array();// 创建Tree
if (is_array($list)) {
// 创建基于主键的数组引用
$refer = array();
foreach ($list as $key => $data) $refer[$data['id']] = &$list[$key];
foreach ($list as $key => $data) {
// 判断是否存在parent
$parentId = $data[$pid];
if (0 == $parentId) {
$tree[] = &$list[$key];
$list[$key][$child] = [];
} else {
if (isset($refer[$parentId])) {
$parent = &$refer[$parentId];
$parent[$child][] = &$list[$key];
}
}
}
}
return $tree;
}
1.2、根据相关键值生成父子关系(二维生成树)
/**
* 根据相关键值生成父子关系
* @param array $arr1 数组1
* @param array $arr2 数组2
* @param string $arr1_key 数组1对应的键值
* @param string $arr2_key 数组2对应的父级键值
* @param string $child 合并的数组键值
*/
function listToTree2(&$arr1, $arr2, $arr1_key = 'id', $arr2_key = 'pid', $child = 'children')
{
foreach ($arr1 as $i => &$item1) {
foreach ($arr2 as $j => $item2) {
if ($item1[$arr1_key] == $item2[$arr2_key]) {
if (!isset($item1[$child]) || !is_array($item1[$child])) $item1[$child] = [];
$item1[$child][] = $item2;
}
}
}
}
1.3、二维数组根据键值排序
/**
* 二维数组根据键值排序
* @param array $array 要排序的数组
* @param string $keys 要用来排序的键名
* @param string $type 默认为降序排序
* @return array
*/
function arraySort($array, $keys, $type = 'desc')
{
//将排序的键名作为键值
$keysValue = $newArray = [];
foreach ($array as $k => $v) $keysValue[$k] = $v[$keys];
($type == 'asc' || $type == 'ASC') ? asort($keysValue) : arsort($keysValue);
reset($keysValue); //重置指针
foreach ($keysValue as $k => $v) $newArray[$k] = $array[$k];
return array_values($newArray); //重置键值
}
1.4、一维/二维数组根据关键字对数组字段进行相似度排序
/**
* 一维/二维数组根据关键字对数组字段进行相似度排序
* @param array $array 原数组
* @param string $keyword 关键字
* @param string $field 要匹配的数组字段名,不传则表示一维数组
* @param int $limit 限制次数,-1不限制
* @return array 排序好的数组
*/
function similarArrSort(array $array, string $keyword, $field = '', $limit = -1)
{
//数组key小于3,直接返回,不符合排序要求(特例,可不写)
if (count($array) <= 3 || ($limit != -1 && $limit <= 3)) {
return $array;
}
$newField = $field; //赋值
//如果传入的field为空则表示一维数组,生成field为label的二维数组
if ($field == &