## think-helper 常用的一些扩展类库
> 以下类库都在`\\think\\helper`命名空间下
*****
## 数组 & 对象
要使用数组类,首先需要在你的类文件中引入
~~~
use think\helper\Arr;
~~~
*****
#### `Arr::add($array, $key, $value)`
如果给定的键在数组中不存在或数组被设置为`null`,那么 `Arr::add` 函数将会把给定的键值对添加到数组中:
```
use think\helper\Arr;
$array = Arr::add(['name' => 'Desk'], 'price', 100);
// ['name' => 'Desk', 'price' => 100]
$array = Arr::add(['name' => 'Desk', 'price' => null], 'price', 100);
// ['name' => 'Desk', 'price' => 100]
```
*****
#### `Arr::collapse($array)`
函数将多个数组合并为一个数组
```
use think\helper\Arr;
$array = Arr::collapse([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);
// [1, 2, 3, 4, 5, 6, 7, 8, 9]
```
*****
#### `Arr::divide($array)`
函数返回一个二维数组,一个值包含原始数组的键,另一个值包含原始数组的值:
```
use think\helper\Arr;
[$keys, $values] = Arr::divide(['name' => 'Desk']);
// $keys: ['name']
// $values: ['Desk']
```
*****
#### `Arr::dot($array, $prepend = '')`
函数将多维数组中所有的键平铺到一维数组中,新数组使用「.」符号表示层级包含关系:
```
use think\helper\Arr;
$array = ['products' => ['desk' => ['price' => 100]]];
$flattened = Arr::dot($array);
// ['products.desk.price' => 100]
```
*****
#### `Arr::except($array, $keys)`
函数从数组中删除指定的键值对:
```
use think\helper\Arr;
$array = ['name' => 'Desk', 'price' => 100];
$filtered = Arr::except($array, ['price']);
// ['name' => 'Desk']
```
*****
#### `Arr::first($array, callable $callback = null, $default = null)`
函数返回数组中通过真值测试的第一个元素:
```
use think\helper\Arr;
$array = [100, 200, 300];
$first = Arr::first($array, function ($value, $key) {
return $value >= 150;
});
// 200
```
*****
#### `Arr::forget(&$array, $keys)`
函数使用「.」符号从深度嵌套的数组中删除给定的键值对:
```
use think\helper\Arr;
$array = ['products' => ['desk' => ['price' => 100]]];
Arr::forget($array, 'products.desk');
// ['products' => []]
```
*****
#### `Arr::get($array, $key, $default = null)`
函数使用「.」符号从深度嵌套的数组中根据指定键检索值:
```
use think\helper\Arr;
$array = ['products' => ['desk' => ['price' => 100]]];
$price = Arr::get($array, 'products.desk.price');
// 100
```
*****
#### `Arr::has($array, $keys)`
函数使用「.」符号查找数组中是否存在指定的一个或多个键:
```
use think\helper\Arr;
$array = ['product' => ['name' => 'Desk', 'price' => 100]];
$contains = Arr::has($array, 'product.name');
// 真
$contains = Arr::has($array, ['product.price', 'product.discount']);
// 假
```
*****
#### `Arr::last($array, callable $callback = null, $default = null)`
函数返回数组中通过指定测试的最后一个元素:
```
use think\helper\Arr;
$array = [100, 200, 300, 110];
$last = Arr::last($array, function ($value, $key) {
return $value >= 150;
});
// 300
```
*****
#### `Arr::only($array, $keys)`
函数只返回给定数组中指定的键值对:
```
use think\helper\Arr;
$array = ['name' => 'Desk', 'price' => 100, 'orders' => 10];
$slice = Arr::only($array, ['name', 'price']);
// ['name' => 'Desk', 'price' => 100]
```
*****
#### `Arr::pluck($array, $value, $key = null)`
函数从数组中检索给定键的所有值:
```
use think\helper\Arr;
$array = [
['developer' => ['id' => 1, 'name' => 'Taylor']],
['developer' => ['id' => 2, 'name' => 'Abigail']],
];
$names = Arr::pluck($array, 'developer.name');
// ['Taylor', 'Abigail']
```
*****
#### `Arr::prepend($array, $value, $key = null)`
函数将一个值插入到数组的开始位置:
```
use think\helper\Arr;
$array = ['one', 'two', 'three', 'four'];
$array = Arr::prepend($array, 'zero');
// ['zero', 'one', 'two', 'three', 'four']
```
如果需要,你可以指定你插入值的键:
```
use think\helper\Arr;
$array = ['price' => 100];
$array = Arr::prepend($array, 'Desk', 'name');
// ['name' => 'Desk', 'price' => 100]
```
*****
#### `Arr::pull(&$array, $key, $default = null)`
函数从数组中返回指定键的值并删除此键/值对:
```
use think\helper\Arr;
$array = ['name' => 'Desk', 'price' => 100];
$name = Arr::pull($array, 'name');
// $name: Desk
// $array: ['price' => 100]
```
*****
#### `Arr::random($array, $number = null)`
函数从数组中随机返回一个值:
```
use think\helper\Arr;
$array = [1, 2, 3, 4, 5];
$random = Arr::random($array);
// 4 - (随机检索)
```
*****
#### `Arr::set(&$array, $key, $value)`
函数使用「.」符号在多维数组中设置指定键的值:
```
use think\helper\Arr;
$array = ['products' => ['desk' => ['price' => 100]]];
Arr::set($array, 'products.desk.price', 200);
// ['products' => ['desk' => ['price' => 200]]]
```
*****
#### `Arr::sort($array, $callback = null)`
函数根据数组的值对数组进行排序:
```
use think\helper\Arr;
$array = ['Desk', 'Table', 'Chair'];
$sorted = Arr::sort($array);
// ['Chair', 'Desk', 'Table']
```
你也可以根据给定闭包返回的结果对数组进行排序:
```
use think\helper\Arr;
$array = [
['name' => 'Desk'],
['name' => 'Table'],
['name' => 'Chair'],
];
$sorted = array_values(Arr::sort($array, function ($value) {
return $value['name'];
}));
/*
[
['name' => 'Chair'],
['name' => 'Desk'],
['name' => 'Table'],
]
*/
```
*****
#### `Arr::sortRecursive($array)`
函数使用 `sort` 函数对数值子数组进行递归排序,使用`ksort`函数对关联子数组进行递归排序:
```
use think\helper\Arr;
$array = [
['Roman', 'Taylor', 'Li'],
['PHP', 'Ruby', 'JavaScript'],
['one' => 1, 'two' => 2, 'three' => 3],
];
$sorted = Arr::sortRecursive($array);
/*
[
['JavaScript', 'PHP', 'Ruby'],
['one' => 1, 'three' => 3, 'two' => 2],
['Li', 'Roman', 'Taylor'],
]
*/
```
*****
#### `Arr::where($array, callable $callback)`
函数使用给定闭包返回的结果过滤数组:
```
use think\helper\Arr;
$array = [100, '200', 300, '400', 500];
$filtered = Arr::where($array, function ($value, $key) {
return is_string($value);
});
// [1 => '200', 3 => '400']
```
*****
#### `Arr::wrap($value)`
函数将给定的值变为一个数组,如果给定的值已经是数组,则不改变:
```
use think\helper\Arr;
$string = 'Laravel';
$array = Arr::wrap($string);
// ['Laravel']
```
*****
#### `data_fill(&$target, $key, $value)`
函数使用「.」符号在多维数组或对象内设置缺省值:
```
$data = ['products' => ['desk' => ['price' => 100]]];
data_fill($data, 'products.desk.price', 200);
// ['products' => ['desk' => ['price' => 100]]]
data_fill($data, 'products.desk.discount', 10);
// ['products' => ['desk' => ['price' => 100, 'discount' => 10]]]
```
这个函数还接受星号「*」作为通配符,相应的填充目标:
```
$data = [
'products' => [
['name' => 'Desk 1', 'price' => 100],
['name' => 'Desk 2'],
],
];
data_fill($data, 'products.*.price', 200);
/*
[
'products' => [
['name' => 'Desk 1', 'price' => 100],
['name' => 'Desk 2', 'price' => 200],
],
]
*/
```
*****
#### `data_get($target, $key, $default = null)`
函数使用「.」符号从多维数组或对象中检索值
```
$data = ['products' => ['desk' => ['price' => 100]]];
$price = data_get($data, 'products.desk.price');
// 100
```
这个函数还接受「*」作为通配符,它可以匹配数组或对象的任何键:
```
$data = [
'product-one' => ['name' => 'Desk 1', 'price' => 100],
'product-two' => ['name' => 'Desk 2', 'price' => 150],
];
data_get($data, '*.name');
// ['Desk 1', 'Desk 2'];
```
*****
#### `data_set(&$target, $key, $value, $overwrite = true)`
函数使用「.」符号在多维数组或对象中设置一个值:
```
$data = ['products' => ['desk' => ['price' => 100]]];
data_set($data, 'products.desk.price', 200);
// ['products' => ['desk' => ['price' => 200]]]
```
该函数也可以接收「*」通配符,相应的在指定键上设置值:
```
$data = [
'products' => [
['name' => 'Desk 1', 'price' => 100],
['name' => 'Desk 2', 'price' => 150],
],
];
data_set($data, 'products.*.price', 200);
/*
[
'products' => [
['name' => 'Desk 1', 'price' => 200],
['name' => 'Desk 2', 'price' => 200],
],
]
*/
```
*****
#### `class_basename($class)`
函数返回被删除了命名空间的指定类的类名:
```
$class = class_basename('Foo\Bar\Baz');
// Baz
```
*****
#### `class_uses_recursive($class)`
函数返回一个类使用的所有 traits , 包括它所有父类使用的 traits:
```
$traits = class_uses_recursive(App\User::class);
```
*****
#### `trait_uses_recursive($trait)`
返回被 trait 使用的全部 trait:
```
$traits = trait_uses_recursive(\Illuminate\Notifications\Notifiable::class);
```
*****
#### `collect($value = null)`
函数根据给定的值创建一个collection实例:
```
$collection = collect(['taylor', 'abigail']);
```
*****
#### `value($value)`
函数返回给定值。如果传递`闭包`给此函数,将执行`闭包`并返回闭包调用的结果:
```
$result = value(true);
// 真
$result = value(function () {
return false;
});
// 假
```
#### `tap($value, $callback = null)`
函数接受两个参数: 任意`$value`和闭包。`$value`将被传递给闭包,并被`tap`函数返回。与闭包的返回值无关:
```
$user = tap(User::first(), function ($user) {
$user->name = 'taylor';
$user->save();
});
```
如果没有向 tap 函数传递闭包,可以调用给定 $value 的任意方法。调用此方法的返回值永远是 $value,无论方法在其定义中返回什么。例如,Eloquent update 方法指定返回一个整数。但是,我们可以通过 tap 函数链式调用 update 方法强制其返回模型自身:
```
$user = tap($user)->update([
'name' => $name,
'email' => $email,
]);
```
*****
#### `throw_unless()`
在给定的布尔表达式结果为`false`时,`throw_unless`函数抛出给定的异常:
```
throw_unless(Auth::user()->isAdmin(), AuthorizationException::class);
throw_unless(
Auth::user()->isAdmin(),
AuthorizationException::class,
'You are not allowed to access this page'
);
```
*****
#### `throw_if()`
在给定的布尔表达式结果为`true`时,`throw_if`函数抛出给定的异常:
```
throw_if(! Auth::user()->isAdmin(), AuthorizationException::class);
throw_if(
! Auth::user()->isAdmin(),
AuthorizationException::class,
'You are not allowed to access this page'
);
```
*****
## 字符串
要使用数组类,首先需要在你的类文件中引入
~~~
use think\helper\Str;
~~~
*****
// 检查字符串中是否包含某些字符串
Str::contains($haystack, $needles)
// 检查字符串是否以某些字符串结尾
Str::endsWith($haystack, $needles)
// 获取指定长度的随机字母数字组合的字符串
Str::random($length = 16)
// 字符串转小写
Str::lower($value)
// 字符串转大写
Str::upper($value)
// 获取字符串的长度
Str::length($value)
// 截取字符串
Str::substr($string, $start, $length = null)
- 序言
- 使用条款
- 安装
- 环境搭建
- 目录结构
- 钩子和行为
- 表单生成
- 数据限制
- 命令行
- 一键生成CRUD
- 一键生成菜单
- 一键安装
- 系统配置
- 常规字段
- 特殊字段1:下拉框(高级)字段
- 特殊字段2:自定义字段
- 特殊字段3:自定义多图片
- 系统函数/类
- 函数说明
- cache - 缓存管理
- thumb - 获取缩略图
- str_cut - 字符截取
- 邮箱/短信
- 插件使用说明
- cms内容管理【cms】
- 变量/常量
- 函数
- getCategory - 栏目获取
- catpos - 面包屑
- seo - 生成SEO
- buildCatUrl - 生成栏目URL
- buildContentUrl - 创建内容链接
- 标签
- 公共参数
- 栏目标签
- 列表标签
- 上一页标签
- 下一页标签
- Tags标签
- 万能标签
- 原生标签
- 搜索页
- 筛选页
- 内容详情页
- 模板
- 技巧/问题
- 将CMS路由设置更简洁
- 外链和单页如何增加列表类型的子栏目
- 如何合理设置SEO
- 实现电脑和手机模板分离
- 敏感词检测
- 栏目授权不全
- 内容页分页
- 分页伪静态
- tag标签不支持特殊字符
- 部分虚拟主机tags页面报错
- 循环表格
- 二级目录搭建知识点
- 阅读收费
- 会员插件【member】
- 介绍
- 自定义表单【formguide】
- 调用方式
- 模板
- 支付插件【pay】
- 支付宝
- 微信
- 常见问题
- 接口文档【apidoc】
- 简介
- 配置
- 使用
- 万能采集【collection】
- 采集列表规则
- 采集内容规则
- 关于图片
- 案例一:采集yzncms论坛
- cms小程序【wxcms】(重构已下架)
- 前端
- H5设计【diywap】
- 返回顶部【returntop】
- 通用数据导出【dataoutput】
- 多通道短信【easysms】
- 塞邮邮箱【saiyouems】
- 第三方登录【synclogin】
- 中文分词【getwords】
- QQ客服【kefu】
- 地图位置【address】
- 智能人机验证【vaptcha】
- 行为验证码【ajcaptcha】
- 数据转换【v9toyzn】
- 数据转换【dedetoyzn】
- 百度收录查询【baidurecord】
- 蜘蛛访问统计【spider】
- editormd编辑器【editormd】
- 敏感词检测【sensitive】
- 邮箱发送【phpmailer】
- 内容收藏【favorite】
- 队列插件【queue】
- 七牛云【qiniu】
- 阿里云oss【alioss】
- 腾讯云【cos】
- 迅搜全文检索【xunsearch】
- 评论插件【comments】
- 网页即时通讯【webim】(重构已下架)
- 生成js
- window使用
- linux使用(推荐)
- 常见问题
- 友情链接【links】
- 考试插件【kaoshi】(暂停)
- 会员邀请【invite】
- 快递查询插件【expressquery】
- 礼品卡提货系统【pickup】
- 地区插件【area】
- IP归属地查询【ipregion】
- 百度统计插件【baidutongji】
- 消息通知【notice】
- 微信管理【wechat】
- 在线投票系统【vote】
- 前端&组件
- 后台前端框架
- 文件上传
- table数据表格
- auth权限验证
- 动态显示(Favisible)
- 动态下拉(SelectPage)
- 键值组件(Fieldlist)
- uniapp教程
- 常见问题
- YznCMS开发遇到错误怎么办?(新手必看)
- 关闭调试模式
- 伪静态(URL重写)
- 虚拟主机不支持绑定public的方法
- 各类虚拟主机伪静态使用注意事项
- 百度编辑器多图片上传被压缩
- 部分虚拟主机隐藏index.php有问题
- 后台路径admin.php修改
- 后台密码忘记重置方法
- 宝塔面板一键部署
- 后台登录时验证码不显示
- 小程序图片不显示
- 如何自定义404页面显示模板
- 管理员登录时提示请于1天后再尝试登录
- composer
- composer简介
- 内置composer
- 各大厂商镜像地址
- 常用命令
- 拓展知识
- 助手类
- thinkphp维护
- 插件开发
- 目录结构
- 数据库
- 测试数据
- 插件信息
- 插件配置
- 核心文件
- 插件函数
- 🔥开发者入驻
- 申请入驻
- 建立私库
- 插件入驻流程
- 模板入驻流程
- 安全建议
- 更新日记和补丁包