通过使用 jQuery 和 Laravel Collections 提供的类似数组的集合对象,轻松而优雅地处理 PHP 数组。
作曲家要求 AIMEOS/地图
支持的 PHP 版本:
PHP 7.1+
PHP 8+
目录
为什么选择 PHP 地图
方法列表
创造
使用权
添加
总计的
调试
命令
缩短
测试
突变
杂项
文档
自定义方法
表现
升级指南
而不是:
$list = [['id' => '一', 'value' => '值1'], ['id' => '二', 'value' => '值2'], null];$list[ ] = ['id'=>'三','值'=>'值3']; // 添加 elementunset( $list[0] ); // 删除元素$list = array_filter( $list ); // 删除空值sort( $list ); // 对元素进行排序$pairs = array_column( $list, 'value', 'id' ); // 创建 ['三' => 'value3']$value = Reset( $pairs ) ?: null; // 返回第一个值
仅使用:
$list = [['id' => '一', 'value' => '值1'], ['id' => '二', 'value' => '值2'], null];$value = map( $list ) // 创建 Map->push( ['id' => ' Three', 'value' => 'value3'] ) // 添加元素->remove( 0 ) // 删除元素->filter () // 删除空值->sort() // 对元素进行排序->col( 'value', 'id' ) // create ['two' => 'value3']->first(); // 返回第一个值
您仍然可以使用:
$map[] = ['id' => '三', 'value' => 'value3'];$value = $map[0];count( $map );foreach( $map as $key => value );
使用回调:
此外,映射对象允许您将匿名函数传递给许多方法,例如:
$map->each( function( $val, $key ) { echo $key . ': ' . $val; } );
jQuery 风格:
如果你的地图元素是对象,你可以为每个对象调用它们的方法并获取结果作为新地图,就像在 jQuery 中一样:
// MyClass 实现 setStatus() (返回 $this)和 getCode() (由构造函数初始化)$map = Map::from( ['a' => new MyClass( 'x' ), 'b' => new MyClass ( 'y' )] );$map->setStatus( 1 )->getCode()->toArray();
这将在两个对象上调用setStatus( 1 )
。如果setStatus()
实现返回$this
,则新映射还将包含:
['a' => MyClass(), 'b' => MyClass()]
在这些新的地图元素上,将调用getCode()
它为第一个对象返回x
,为第二个对象返回y
。从getCode()
结果创建的地图将返回:
['a' => 'x', 'b' => 'y']
function map function is_map __call __callStatic __construct after all arsort arsorted asorted at avg before bool callcast chunkclearclonecolcolcollapsecombinecompareconcat containscopycountcountBydddelimiterdiffdiffAssocdiffKeysdumpduplicateseachempty equalsevery exceptexplodefilterfindfirstfirstKeyflatflip float from fromJson get getIterator grep groupBy 有 if ifAny ifEmpty 在包含索引 insertAfter insertAt 中实现insertBefore inString int intersect intersectAssoc intersectKeys is isEmpty isNumeric isObject isScalar isString join json序列化键 krsort krsorted ksort 最后lastKey ltrim map max 合并方法 min none nth offsetExists offsetGet offsetSet offsetUnset 只排序 pad 分区百分比 pipeline pluck pop pos 前缀 prepend pull push put 随机reduce 拒绝 rekey删除 替换 反向 反向 rsort 重新排序 rtrim 搜索 sep 设置 移位洗牌 洗牌 跳过切片 某种排序 排序 拼接 分割 strAfter strContains strContainsAll strEnds strEndsAll string strLower strReplace strStarts strStartsAll strUpper 后缀总和 占用点击时间 toArray toJson toReversed toSorted toUrl 变换 转置 遍历树修剪 uasort uasorted uksort uksorted union unique unshift usort usort 排序值 使用 zip 走到哪里
function map() :从传递的元素创建一个新的映射
__construct() :创建一个新地图
clone() :克隆地图及其中的所有对象
copy() :创建一个新副本
explode() :将字符串拆分为元素映射
from() :从传递的元素创建一个新映射
fromJson() :从 JSON 字符串创建新地图
times() :通过多次调用闭包创建一个新地图
tree() :从列表项创建树结构
__call() :调用自定义方法
__callStatic() :静态调用自定义方法
all() :返回普通数组
at() :返回给定位置的值
bool() :通过键返回一个元素并将其转换为布尔值
call() :对所有项目调用给定方法
find() :返回第一个/最后一个匹配元素
first() :返回第一个元素
firstKey() :返回第一个键
get() :按键返回元素
index() :返回给定键的数字索引
int() :按键返回一个元素并将其转换为整数
float() :按键返回一个元素并将其转换为 float
keys() :返回所有键
last() :返回最后一个元素
lastKey() :返回最后一个键
pop() :返回并删除最后一个元素
pos() :返回值的数字索引
pull() :通过键返回并删除元素
random() :返回保留密钥的随机元素
search() :查找元素的键
shift() :返回并删除第一个元素
string() :按键返回元素并将其转换为字符串
toArray() :返回普通数组
unique() :返回保留键的所有唯一元素
value() :返回具有新键的所有元素
concat() :使用新键添加所有元素
insertAfter() :在给定元素之后插入值
insertAt() :在地图中的给定位置插入元素
insertBefore() :在给定元素之前插入值
merge() :合并元素并覆盖现有元素
pad() :用给定值填充到指定长度
prepend() :在开头添加一个元素(别名)
push() :在末尾添加一个元素
put() :在映射中设置给定的键和值(别名)
set() :覆盖或添加元素
union() :添加元素而不覆盖现有元素
unshift() :在开头添加一个元素
with() :返回一个副本并设置一个元素
avg() :返回所有值的平均值
count() :返回元素总数
countBy() :计算相同值在地图中出现的频率
max() :返回所有元素的最大值
min() :返回所有元素的最小值
Percentage() :返回所有通过测试的元素的百分比
sum() :返回映射中所有值的总和
dd() :打印地图内容并终止脚本
dump() :打印地图内容
tap() :将地图的克隆传递给给定的回调
arsort() :保留键的反向排序元素
asorted() :反向排序元素,保留映射副本中的键
asort() :对保留键的元素进行排序
asorted() :对元素进行排序,保留映射副本中的键
krsort() :按键对元素进行反向排序
krsorted() :按映射副本中的键对元素进行反向排序
ksort() :按键对元素进行排序
order() :按传递的键对元素进行排序
reverse() :反转数组顺序并保留键
returned() :反转映射副本中的元素顺序
toReversed() :反转映射副本中的元素顺序(别名)
rsort() :使用新键对元素进行反向排序
rsorted() :使用映射副本中的新键对元素进行反向排序
shuffle() :随机化元素顺序
shuffled() :随机化映射副本中的元素顺序
sort() :对分配新键的元素进行就地排序
sorted() :使用新键对映射副本中的元素进行排序
toSorted() :使用新键(别名)对映射副本中的元素进行排序
uasort() :使用回调对保留键的元素进行排序
uasorted() :使用映射副本中的回调对保留键的元素进行排序
uksort() :使用回调按键对元素进行排序
uksorted() :使用映射副本中的回调按键对元素进行排序
usort() :使用回调分配新键对元素进行排序
usorted() :使用回调在映射副本中分配新键对元素进行排序
after() :返回给定元素之后的元素
before() :返回给定元素之前的元素
clear() :删除所有元素
diff() :返回给定列表中缺少的元素
diffAssoc() :返回给定列表中缺少的元素并检查键
diffKeys() :按键返回给定列表中缺少的元素
except() :返回一个没有传递元素键的新映射
filter() :对所有元素应用过滤器
grep() :将正则表达式应用于所有元素
intersect() :返回共享的元素
intersectAssoc() :返回共享元素并检查键
intersectKeys() :返回键共享的元素
nth() :返回映射中的每个第 n 个元素
only() :仅返回键指定的元素
pop() :返回并删除最后一个元素
pull() :通过键返回并删除元素
reject() :删除所有匹配的元素
remove() :通过键删除元素
shift() :返回并删除第一个元素
Skip() :跳过给定数量的项目并返回其余项目
slice() :返回地图的切片
take() :返回具有给定项目数的新地图
where() :按给定条件过滤元素列表
function is_map() :测试变量是否是映射对象
compare() :将值与所有映射元素进行比较
contains() :测试地图中是否存在项目
each() :对每个元素应用回调
empty() :测试地图是否为空
equals() :测试地图内容是否相等
every() :验证所有元素是否通过给定回调的测试
has() :测试键是否存在
if() :根据条件执行回调
ifAny() :如果地图包含元素则执行回调
ifEmpty() :如果地图为空则执行回调
in() :测试是否包含元素
include() :测试是否包含元素
inString() :测试该项目是否是地图中字符串的一部分
is() :测试映射是否包含相同的键和值
isEmpty() :测试地图是否为空
isNumeric() :测试所有条目是否都是数值
isObject() :测试所有条目是否都是对象
isScalar() :测试所有条目是否都是标量值。
isString() :测试所有条目是否都是字符串值。
Implements() :测试所有条目是否都是实现接口的对象
none() :测试是否没有元素属于映射
some() :测试是否至少包含一个元素
strContains() :测试至少一个传递的字符串是否是至少一个条目的一部分
strContainsAll() :测试所有条目是否包含传递的字符串之一
strEnds() :测试是否至少有一个条目以传递的字符串之一结尾
strEndsAll() :测试所有条目是否至少以传递的字符串之一结尾
strStarts() :测试至少一个条目是否以至少一个传递的字符串开头
strStartsAll() :测试所有条目是否以传递的字符串之一开头
cast() :将所有条目转换为传递的类型
chunk() :将地图分割成块
col() :创建键/值映射
crash() :折叠多维元素覆盖元素
组合():将地图元素作为键与给定值组合
flat() :展平多维元素而不覆盖元素
Flip() :将键与其值交换
groupBy() :对关联数组元素或对象进行分组
join() :将连接的元素作为带分隔符的字符串返回
ltrim() :从所有字符串的左侧删除传递的字符
map() :对每个元素应用回调并返回结果
partition() :将列表分成给定数量的组
pipeline() :对整个映射应用回调
pluck() :创建键/值映射(别名)
prefix() :为每个映射条目添加前缀
reduce() :根据地图内容计算单个值
rekey() :根据传递的函数更改密钥
Replace() :递归替换元素
rtrim() :从所有字符串的右侧删除传递的字符
splice() :用新元素替换切片
strAfter() :返回传递值之后的字符串
strLower() :将所有字母字符转换为小写
strReplace() :用替换字符串替换所有出现的搜索字符串
strUpper() :将所有字母字符转换为大写
suffix() :为每个映射条目添加后缀
toJson() :以 JSON 格式返回元素
toUrl() :创建 HTTP 查询字符串
transfrom() :对创建新键/值对的每个元素应用回调
transpose() :交换二维映射的行和列
traverse() :遍历嵌套项目树,将每个项目传递给回调
Trim() :从所有字符串的左侧/右侧删除传递的字符
walk() :将给定的回调应用于所有元素
zip() :合并相应索引处所有数组的值
delimiter() :设置或返回多维数组路径的分隔符
getIterator() :返回元素的迭代器
jsonSerialize() :指定应序列化为 JSON 的数据
method() :注册自定义方法
offsetExists() :检查键是否存在
offsetGet() :按键返回元素
offsetSet() :覆盖一个元素
offsetUnset() :通过键删除元素
sep() :设置当前映射中多维数组的路径分隔符
测试变量是否是映射对象
函数 is_map( $var ) : bool
@param mix $var
要测试的变量
示例:
is_map( new Map() );// trueis_map( [] );// false
返回传递的元素的新映射。
函数映射( $elements = [] ) : AimeosMap
@param mix $elements
元素列表或单个值
@return AimeosMap地图实例
示例:
// arraymap( [] );// nullmap( null );// scalarmap( 'a' );// objectmap( new stdClass() );// 映射 objectmap( new Map() );// 可迭代 objectmap( new ArrayObject() );// 闭包计算 lazilymap( function() {return []; } );
参见:
rekey() - 根据传递的函数更改密钥
Transform() - 使用传递的函数创建新的键/值对并返回结果的新映射
创建一个新的地图对象。
公共函数 __construct( $elements = [] )
@param mix $elements
单个元素、元素列表、Map 对象、可迭代对象或迭代器、其他所有内容
示例:
// arraynew Map( [] );// nullnew Map( null );// 标量new Map( 'a' );// objectnew Map( new stdClass() );// 映射 objectnew Map( new Map() ); // 可迭代对象 new Map( new ArrayObject() );// 闭包延迟计算 new Map( function() {return []; } );
处理对类的自定义方法的动态调用。
公共函数 __call( 字符串 $name, 数组 $params )
@param string $name
方法名称
@param array<mixed> $params
参数列表
@return 被调用函数或新映射的混合结果以及元素方法的结果
调用Map::method()添加的自定义方法。被调用的方法可以使用$this->items
访问内部数组。
示例:
Map::method( 'case', function( $case = CASE_LOWER ) {return new self( array_change_key_case( $this->items, $case ) ); } ); Map::from( ['a' => 'bar'] )->case( CASE_UPPER );// ['A' => 'bar']
如果项目是对象,这也允许调用对象方法:
$item = new MyClass(); // 使用方法 setStatus() (返回 $this)和 getCode() ImplementMap::from( [$item, $item] )->setStatus( 1 )->getCode()->toArray();
这将调用映射中每个元素的setStatus()
方法,并使用它们的返回值创建一个新映射。在新映射上,为每个元素调用getCode()
方法,其返回值也存储在新映射中。然后返回最后一个映射,并且原始映射中的映射键将保留在返回的映射中。
如果元素不是对象,则跳过它们,如果这适用于所有元素,则返回空映射。如果映射包含混合类型的对象,并且其中一个对象未实现所调用的方法,则会抛出错误。
处理对类的自定义方法的静态调用。
公共静态函数 __callStatic( 字符串 $name, 数组 $params )
@param string $name
方法名称
@param array<mixed> $params
参数列表
@return 被调用函数或新映射的混合结果以及元素方法的结果
@throws BadMethodCallException如果没有为该名称注册任何方法
静态调用 Map::method() 添加的自定义方法。被调用的方法无法访问内部数组,因为没有可用的对象。
示例:
地图::method( 'foo', function( $arg1, $arg2 ) {} ); 地图::foo( $arg1, $arg2 );
返回给定元素之后的元素。
($value) 之后的公共函数:self
@param Closure|int|string $value
具有 (item, key) 参数的值或函数
@return self<int|string,mixed>包含给定元素之后元素的新映射
使用此方法保存密钥。
示例:
Map::from( [0 => 'b', 1 => 'a'] )->after( 'b' );// [1 => 'a']Map::from( ['a' = > 1, 'b' => 0] )->after( 1 );// ['b' => 0]Map::from( [0 => 'b', 1 => 'a'] )->after( 'c' );// []Map::from( ['a', 'c', 'b'] )->after( function( $item, $key ) {return $item > ='c'; } );// [2 => 'b']
以普通数组的形式返回元素。
公共函数 all() :数组
@return array普通数组
示例:
Map::from( ['a'] )->all();// ['a']
按相反顺序对所有元素进行排序并保持键关联。
公共函数 arsort( int $options = SORT_REGULAR ) : self
@param int $options
arsort()
的排序选项
@return self<int|string,mixed>更新了流体界面的地图
使用此方法保留密钥并且不会创建新的映射。
$options
参数修改值的比较方式。可能的参数值为:
SORT_REGULAR :正常比较元素(不更改类型)
SORT_NUMERIC :以数字方式比较元素
SORT_STRING :将元素作为字符串进行比较
SORT_LOCALE_STRING :根据当前语言环境或通过setlocale()
更改,将元素作为字符串进行比较
SORT_NATURAL :使用“自然排序”(如natsort()
将元素作为字符串进行比较
SORT_FLAG_CASE :使用 SORT_STRING|SORT_FLAG_CASE 和 SORT_NATURAL|SORT_FLAG_CASE 对字符串进行不区分大小写的排序
示例:
Map::from( ['b' => 0, 'a' => 1] )->arsort();// ['a' => 1, 'b' => 0]Map::from( [ 'a', 'b'] )->arsort();// ['b', 'a']Map::from( [0 => 'C', 1 => 'b'] )->arsort();// [1 => 'b', 0 => 'C']Map::from( [0 => 'C', 1 => 'b'] )->arsort( SORT_STRING |SORT_FLAG_CASE );// [0 => 'C', 1 => 'b'] 因为 'C' -> 'c' 且 'c' > 'b'
以相反顺序对所有元素的副本进行排序并维护键关联。
公共函数 Arsorted( int $options = SORT_REGULAR ) : self
@param int $options
arsort()
的排序选项
@return self<int|string,mixed>更新了流体界面的地图
使用此方法保留密钥并创建新的映射。
$options
参数修改值的比较方式。可能的参数值为:
SORT_REGULAR :正常比较元素(不更改类型)
SORT_NUMERIC :以数字方式比较元素
SORT_STRING :将元素作为字符串进行比较
SORT_LOCALE_STRING :根据当前语言环境或通过setlocale()
更改,将元素作为字符串进行比较
SORT_NATURAL :使用“自然排序”(如natsort()
将元素作为字符串进行比较
SORT_FLAG_CASE :使用 SORT_STRING|SORT_FLAG_CASE 和 SORT_NATURAL|SORT_FLAG_CASE 对字符串进行不区分大小写的排序
示例:
Map::from( ['b' => 0, 'a' => 1] )->arsorted();// ['a' => 1, 'b' => 0]Map::from( [ 'a', 'b'] )->arsorted();// ['b', 'a']Map::from( [0 => 'C', 1 => 'b'] )->arsorted();// [1 => 'b', 0 => 'C']Map::from( [0 => 'C', 1 => 'b'] )->arsorted( SORT_STRING |SORT_FLAG_CASE );// [0 => 'C', 1 => 'b'] 因为 'C' -> 'c' 和 'c' > 'b'
对所有元素进行排序并维护键关联。
公共函数 asort( int $options = SORT_REGULAR ) : self
@param int $options
asort()
的排序选项
@return self<int|string,mixed>更新了流体界面的地图
使用此方法保留密钥并且不会创建新的映射。
该参数修改值的比较方式。可能的参数值为:
SORT_REGULAR :正常比较元素(不更改类型)
SORT_NUMERIC :以数字方式比较元素
SORT_STRING :将元素作为字符串进行比较
SORT_LOCALE_STRING :根据当前语言环境或通过setlocale()
更改,将元素作为字符串进行比较
SORT_NATURAL :使用“自然排序”(如natsort()
将元素作为字符串进行比较
SORT_FLAG_CASE :使用 SORT_STRING|SORT_FLAG_CASE 和 SORT_NATURAL|SORT_FLAG_CASE 对字符串进行不区分大小写的排序
示例:
Map::from( ['a' => 1, 'b' => 0] )->asort();// ['b' => 0, 'a' => 1]Map::from( [ 0 => 'b', 1 => 'a'] )->asort();// [1 => 'a', 0 => 'b']Map::from( [0 => 'C', 1 => 'b'] )->asort();// [0 => 'C', 1 => 'b'] 因为 'C' < 'b'Map::from( [0 => 'C', 1 => 'b'] )->arsort( SORT_STRING|SORT_FLAG_CASE );// [1 => 'b', 0 => 'C'] 因为 'C' -> 'c' 且 'c' > 'b'
对所有元素的副本进行排序并维护键关联。
公共函数 asorted( int $options = SORT_REGULAR ) : self
@param int $options
asort()
的排序选项
@return self<int|string,mixed>更新了流体界面的地图
使用此方法保留密钥并创建新的映射。
该参数修改值的比较方式。可能的参数值为:
SORT_REGULAR :正常比较元素(不更改类型)
SORT_NUMERIC :以数字方式比较元素
SORT_STRING :将元素作为字符串进行比较
SORT_LOCALE_STRING :根据当前语言环境或通过setlocale()
更改,将元素作为字符串进行比较
SORT_NATURAL :使用“自然排序”(如natsort()
将元素作为字符串进行比较
SORT_FLAG_CASE :使用 SORT_STRING|SORT_FLAG_CASE 和 SORT_NATURAL|SORT_FLAG_CASE 对字符串进行不区分大小写的排序
示例:
Map::from( ['a' => 1, 'b' => 0] )->asorted();// ['b' => 0, 'a' => 1]Map::from( [ 0 => 'b', 1 => 'a'] )->asorted();// [1 => 'a', 0 => 'b']Map::from( [0 => 'C', 1 => 'b'] )->asorted();// [0 => 'C', 1 => 'b'] 因为 'C' < 'b'Map::from( [0 => 'C', 1 => 'b'] )->分类( SORT_STRING|SORT_FLAG_CASE );// [1 => 'b', 0 => 'C'] 因为 'C' -> 'c' 且 'c' > 'b'
返回给定位置的值。
公共函数 at( int $pos )
@param int $pos
值在地图中的位置
@return mix�null给定位置的值或 NULL(如果没有可用值)
位置从零开始,位置“0”返回映射的第一个元素,“1”返回第二个元素,依此类推。如果位置为负,则序列将从地图末尾开始。
示例:
Map::from( [1, 3, 5] )->at( 0 );// 1Map::from( [1, 3, 5] )->at( 1 );// 3Map::from( [ 1, 3, 5] )->at( -1 );// 5Map::from( [1, 3, 5] )->at( 3 );// NULL
返回地图中所有整数和浮点值的平均值。
公共函数 avg( $col = null ) : 浮点数
@param Closure|string|null $col
嵌套数组或对象中值的闭包、键或路径,用于计算平均值
@return float所有元素的平均值,如果地图中没有元素则为 0
NULL 值被视为 0,非数字值将产生错误。
这也适用于多维数组,通过传递由分隔符(默认为“/”)分隔的数组键,例如“key1/key2/key3”从['key1' => ['key2' => ['key3' => 'val']]]
。这同样适用于对象的公共属性或实现__isset()
和__get()
方法的对象。
示例:
Map::from( [1, 3, 5] )->avg();// 3Map::from( [1, null, 5] )->avg();// 3Map::from( [1, 'sum', 5] )->avg();// 2Map::from( [['p' => 30], ['p' => 50], ['p' => 10]] )->avg( 'p' );// 30Map::from( [['i' => ['p' => 30]], ['<sp