类 Hash
用于操作和提取数组或数据集中数据的数组函数库。
Hash 提供了改进的接口,比 Set 更加一致和可预测的功能集。虽然它缺乏对伪 Xpath 的支持,但它更加完整的功能点符号提供了类似的功能,以更一致的方式实现。
方法概述
-
_filter() protected static
用于过滤的回调函数。
-
_matchToken() protected static
检查键是否与令牌匹配。
-
_matches() protected static
检查 $data 是否与属性模式匹配。
-
_merge() protected static
合并辅助函数,减少 merge() 和 expand() 之间的重复代码。
-
_simpleOp() protected static
执行简单的插入/删除操作。
-
_splitConditions() protected static
拆分令牌条件。
-
_squash() protected static
sort() 的辅助方法,将数组压缩成单个哈希以便排序。
-
apply() public static
使用
$function将回调应用于一组提取的值。该函数将提取的值作为第一个参数。 -
check() public static
测试给定路径是否在 $data 中存在。此方法使用与 Hash::extract() 相同的路径语法。
-
combine() public static
使用
$keyPath作为构建其键的路径,并选择使用$valuePath作为获取值的路径,来创建关联数组。如果未指定$valuePath,则所有值将初始化为 null(对于 Hash::merge 非常有用)。您可以选择根据按照$groupPath中指定的路径获得的值对值进行分组。 -
contains() public static
确定一个数组是否包含另一个数组的完全相同的键和值。
-
diff() public static
计算两个复杂数组之间的差异。此方法不同于内置的 array_diff(),因为它将保留键并作用于多维数组。
-
dimensions() public static
计算数组的维度。只考虑数组中第一个元素的维度。
-
expand() public static
将扁平数组扩展为嵌套数组。
-
extract() public static
获取与 $path 表达式匹配的数组中的值。路径表达式是一个用点分隔的表达式,可以包含一组模式和表达式。
-
filter() public static
递归地过滤数据集。
-
flatten() public static
将多维数组折叠成单维数组,使用分隔的数组路径作为每个数组元素的键,例如:[['Foo' => ['Bar' => 'Far']]] 变为 ['0.Foo.Bar' => 'Far']。
-
format() public static
返回从
$data中提取的一系列格式化值,使用$format作为格式,使用$paths作为要提取的值。 -
get() public static
从 $data 中获取 $path 指定的单个值。不支持完整的点符号功能集,但对于简单的读取操作更快。
-
insert() public static
使用给定的 $path 将 $values 插入数组。您可以使用
{n}和{s}元素多次插入 $data。 -
map() public static
将回调映射到集合中的所有元素。可以提供路径来仅修改集合的切片。
-
maxDimensions() public static
计算所有数组元素的维度。对于在混合数组中查找最大维度很有用。
-
merge() public static
此函数可以看作是 PHP 的
array_merge和array_merge_recursive的混合体。 -
mergeDiff() public static
将 $data 和 $compare 之间的差异合并到 $data 上。
-
nest() public static
接收扁平数组并返回嵌套数组。
-
normalize() public static
规范化数组,并将其转换为标准格式。
-
numeric() public static
检查数组中的所有值是否都是数字。
-
reduce() public static
使用
$function减少一组提取的值。 -
remove() public static
从 $data 数组中删除与 $path 匹配的数据。您可以使用
{n}和{s}从 $data 中删除多个元素。 -
sort() public static
根据任何值对数组进行排序,由 Set 兼容的路径确定。
方法详情
_matchToken() ¶ protected static
_matchToken(mixed $key, string $token): bool
检查键是否与令牌匹配。
参数
-
mixed$key 正在搜索的数组中的键。
-
string$token 正在匹配的令牌。
返回
bool_matches() ¶ protected static
_matches(ArrayAccess|array $data, string $selector): bool
检查 $data 是否与属性模式匹配。
参数
-
ArrayAccess|array$data 要匹配的数据数组。
-
string$selector 要匹配的模式。
返回
bool_merge() ¶ protected static
_merge(array $stack, array $return): void
合并辅助函数,减少 merge() 和 expand() 之间的重复代码。
参数
-
array$stack 要使用的操作堆栈。
-
array$return 要操作的返回值。
返回
void_simpleOp() ¶ protected static
_simpleOp(string $op, ArrayAccess|array $data, list<string> $path, mixed $values = null): ArrayAccess|array
执行简单的插入/删除操作。
参数
-
string$op 要执行的操作。
-
ArrayAccess|array$data 要操作的数据。
-
list<string>$path 要操作的路径。
-
mixed$values optional 执行插入时要插入的值。
返回
ArrayAccess|array_splitConditions() ¶ protected static
_splitConditions(string $token): array
拆分令牌条件。
参数
-
string$token 要拆分的令牌。
返回
array_squash() ¶ protected static
_squash(array $data, string|int|null $key = null): array
sort() 的辅助方法,将数组压缩成单个哈希以便排序。
参数
-
array$data 要压缩的数据。
-
string|int|null$key 可选 数据的键。
返回
arrayapply() ¶ public static
apply(array $data, string $path, callable $function): mixed
使用 $function 将回调应用于一组提取的值。该函数将提取的值作为第一个参数。
示例
您可以轻松地使用 apply() 来计算提取结果的计数。例如,要计算文章的评论数
$count = Hash::apply($data, 'Article.Comment.{n}', 'count');
您也可以使用 array_sum 这样的函数来对结果求和。
$total = Hash::apply($data, '{n}.Item.price', 'array_sum');
参数
-
array$data 要减少的数据。
-
string$path 从 $data 中提取的路径。
-
callable$function 对每个提取的值调用的函数。
返回
混合链接
check() ¶ public static
check(array $data, string $path): bool
测试给定路径是否在 $data 中存在。此方法使用与 Hash::extract() 相同的路径语法。
检查可能针对多个元素的路径将确保至少存在一个匹配的元素。
参数
-
array$data 要检查的数据。
-
string$path 要检查的路径。
返回
bool另请参阅
链接
combine() ¶ public static
combine(array $data, list<string>|string|null $keyPath, list<string>|string|null $valuePath = null, string|null $groupPath = null): array
使用 $keyPath 作为构建其键的路径,并选择使用 $valuePath 作为获取值的路径,来创建关联数组。如果未指定 $valuePath,则所有值将初始化为 null(对于 Hash::merge 非常有用)。您可以选择根据按照 $groupPath 中指定的路径获得的值对值进行分组。
参数
-
array$data 从中提取键和值的数组
-
list<string>|string|null$keyPath 一个点分隔的字符串。
-
list<string>|string|null$valuePath 可选 一个点分隔的字符串。
-
string|null$groupPath 可选 一个点分隔的字符串。
返回
array抛出
InvalidArgumentException当键和值数量不相等时。
链接
contains() ¶ public static
contains(array $data, array $needle): bool
确定一个数组是否包含另一个数组的完全相同的键和值。
参数
-
array$data 要搜索的数据。
-
array$needle 要在 $data 中查找的值
返回
bool链接
diff() ¶ public static
diff(array $data, array $compare): array
计算两个复杂数组之间的差异。此方法不同于内置的 array_diff(),因为它将保留键并作用于多维数组。
参数
-
array$data 第一个值
-
array$compare 第二个值
返回
array链接
dimensions() ¶ public static
dimensions(array $data): int
计算数组的维度。只考虑数组中第一个元素的维度。
如果您有一个不均匀或异构数组,请考虑使用 Hash::maxDimensions() 来获取数组的维度。
参数
-
array$data 要计算维度的数组
返回
int链接
expand() ¶ public static
expand(array $data, string $separator = '.'): array
将扁平数组扩展为嵌套数组。
例如,将使用 Hash::flatten() 压缩的数组展开为多维数组。因此,['0.Foo.Bar' => 'Far'] 变为 [['Foo' => ['Bar' => 'Far']]]。
参数
-
array$data 扁平化的数组
-
string$separator 可选 使用的分隔符
返回
array链接
extract() ¶ public static
extract(ArrayAccess|array $data, string $path): ArrayAccess|array
获取与 $path 表达式匹配的数组中的值。路径表达式是一个用点分隔的表达式,可以包含一组模式和表达式。
{n}匹配任何数字键或整数。{s}匹配任何字符串键。{*}匹配任何值。Foo匹配具有完全相同值的任何键。
有一些属性运算符
=,!=相等性。>,<,>=,<=值比较。=/.../正则表达式模式匹配。
给定一组用户数组数据,来自 $usersTable->find('all') 调用
1.User.name获取索引 1 处用户的姓名。{n}.User.name获取用户集中每个用户的姓名。{n}.User[id].name获取每个具有 id 键的用户的姓名。{n}.User[id>=2].name获取 id 键大于或等于 2 的每个用户的姓名。{n}.User[username=/^paul/]获取用户名与^paul匹配的用户元素。{n}.User[id=1].name获取 id 与1匹配的用户的姓名。
参数
-
ArrayAccess|array$data 要从中提取的数据。
-
string$path 要提取的路径。
返回
ArrayAccess|array链接
filter() ¶ public static
filter(array $data, callable|null $callback = null): array
递归地过滤数据集。
参数
-
array$data 要过滤的数组,或回调中的值
-
callable|null$callback 可选 用于过滤数据的函数。默认为所有非空或零值。
返回
array链接
flatten() ¶ public static
flatten(array $data, string $separator = '.'): array
将多维数组折叠成单维数组,使用分隔的数组路径作为每个数组元素的键,例如:[['Foo' => ['Bar' => 'Far']]] 变为 ['0.Foo.Bar' => 'Far']。
参数
-
array$data 要扁平化的数组
-
string$separator 可选 用于分隔路径中数组键元素的字符串,默认为 '.'
返回
array链接
format() ¶ public static
format(array $data, list<string> $paths, string $format): list<string>|null
返回从 $data 中提取的一系列格式化值,使用 $format 作为格式,使用 $paths 作为要提取的值。
用法
$result = Hash::format($users, ['{n}.User.id', '{n}.User.name'], '%s : %s');
$format 字符串可以使用 vsprintf() 和 sprintf() 支持的任何格式选项。
参数
-
array$data 从中提取数据的源数组
-
list<string>$paths 包含一个或多个 Hash::extract()-style 键路径的数组
-
string$format 将插入值的格式字符串,请参阅 sprintf()
返回
list<string>|null另请参阅
\Cake\Utility\Hash::extract()
链接
get() ¶ public static
get(ArrayAccess|array $data, list<string>|string|int|null $path, mixed $default = null): mixed
从 $data 中获取 $path 指定的单个值。不支持完整的点符号功能集,但对于简单的读取操作更快。
参数
-
ArrayAccess|array$data 要操作的数据数组或实现 \ArrayAccess 接口的对象。
-
list<string>|string|int|null$path 正在搜索的路径。点分隔字符串或路径段数组。
-
mixed$default 可选 路径不存在时的返回值
返回
混合抛出
InvalidArgumentException链接
insert() ¶ public static
insert(T $data, string $path, mixed $values = null): ArrayAccess|array
使用给定的 $path 将 $values 插入数组。您可以使用 {n} 和 {s} 元素多次插入 $data。
参数
-
T$data 要插入的数据。
-
string$path 要插入的路径。
-
mixed$values optional 要插入的值。
返回
ArrayAccess|array链接
map() ¶ public static
map(array $data, string $path, callable $function): array
将回调映射到集合中的所有元素。可以提供路径来仅修改集合的切片。
参数
-
array$data 要映射并从中提取数据的数据。
-
string$path 用于映射的提取路径。
-
callable$function 对每个提取的值调用的函数。
返回
array链接
maxDimensions() ¶ public static
maxDimensions(array $data): int
计算所有数组元素的维度。对于在混合数组中查找最大维度很有用。
参数
-
array$data 要计算维度的数组
返回
int链接
merge() ¶ public static
merge(array $data, mixed $merge): array
此函数可以看作是 PHP 的 array_merge 和 array_merge_recursive 的混合体。
此方法与内置方法之间的区别在于,如果数组键包含另一个数组,则 Hash::merge() 将以递归方式运行(与 array_merge 不同)。但它不会对包含标量值的键进行递归操作(与 array_merge_recursive 不同)。
此函数将处理无限数量的参数,并将非数组参数类型转换为数组。
参数
-
array$data 要合并的数组
-
mixed$merge 要合并的数组。参数和所有尾随参数在合并时将被数组类型转换
返回
array链接
mergeDiff() ¶ public static
mergeDiff(array $data, array $compare): array
将 $data 和 $compare 之间的差异合并到 $data 上。
参数
-
array$data 要附加到的数据。
-
array$compare 要比较并附加到的数据。
返回
array链接
nest() ¶ public static
nest(array $data, array<string, string|null> $options = []): list<array>
接收扁平数组并返回嵌套数组。
选项
children结果集中用于子项的键名。idPath标识每个条目的键的路径。应与 Hash::extract() 兼容。默认为{n}.$alias.idparentPath标识每个条目父项的键的路径。应与 Hash::extract() 兼容。默认为{n}.$alias.parent_idroot想要的最顶层结果的 id。
参数
-
array$data 要嵌套的数据。
-
array<string, string|null>$options 可选 选项。
返回
list<array>抛出
InvalidArgumentException提供无效数据时。
另请参阅
链接
normalize() ¶ public static
normalize(array $data, bool $assoc = true, mixed $default = null): array
规范化数组,并将其转换为标准格式。
参数
-
array$data 要规范化的列表
-
bool$assoc 可选 如果为 true,则 $data 将被转换为关联数组。
-
mixed$default 可选 将顶层数字键转换为关联形式时使用的默认值。
返回
array链接
numeric() ¶ public static
numeric(array $data): bool
检查数组中的所有值是否都是数字。
参数
-
array$data 要检查的数组。
返回
bool链接
reduce() ¶ public static
reduce(array $data, string $path, callable $function): mixed
使用 $function 减少一组提取的值。
参数
-
array$data 要减少的数据。
-
string$path 从 $data 中提取的路径。
-
callable$function 对每个提取的值调用的函数。
返回
混合链接
remove() ¶ public static
remove(T $data, string $path): ArrayAccess|array
从 $data 数组中删除与 $path 匹配的数据。您可以使用 {n} 和 {s} 从 $data 中删除多个元素。
参数
-
T$data 要操作的数据
-
string$path 要用于删除的路径表达式。
返回
ArrayAccess|array链接
sort() ¶ public static
sort(array $data, string $path, string|int $dir = 'asc', array<string, mixed>|string $type = 'regular'): array
根据任何值对数组进行排序,由 Set 兼容的路径确定。
排序方向
asc或 \SORT_ASC 递增排序。desc或 \SORT_DESC 递减排序。
排序类型
regular常规排序(不改变类型)numeric按数值比较string按字符串比较locale根据当前区域设置按字符串比较natural使用“自然排序”按字符串比较,以人性化方式排序,例如,将 foo10 排序到 foo2 之后。
要执行不区分大小写的排序,请将类型作为数组传递,如下所示
Hash::sort($data, 'some.attribute', 'asc', ['type' => 'regular', 'ignoreCase' => true]);
使用数组形式时,type 默认为 'regular'。ignoreCase 选项默认为 false。
参数
-
array$data 要排序的数据数组
-
string$path 与 Set 兼容的数组值路径
-
string|int$dir 可选 参见上面的方向。默认为 'asc'。
-
array<string, mixed>|string$type 可选 参见上面的方向类型。默认为 'regular'。
返回
array