gupalo / arrayutils
数组工具
1.10.0
2024-01-26 18:33 UTC
Requires
- php: >=8.0
- symfony/property-access: ^5.0|^6.0|^7.0
Requires (Dev)
- phpunit/phpunit: ^10.0
README
安装
composer require gupalo/arrayutils
特性
所有代码都经过测试覆盖。查看测试以更好地了解其工作方式。
所有方法都是静态的。
项目可以是以下之一的可迭代(数组、生成器等):
- 数组
- 具有公共属性或获取器(任何 Symfony PropertyAccessor 可以获取)的对象
ArrayAggregator
max(items, field)
:项目中的最大字段值sum(items, field)
:项目字段值的总和ratio(items, field, field2
:"按 field 求和"/"按 field2 求和"
maxRatio(items, field, field2)
:最大值,其中"field 值"/"field2 值"
ArrayComparer
比较是智能的 - 如果比较值是浮点数,则使用精度 = 8 进行四舍五入。
compareOne(a1, a2, keys)
:检查每个(string)a1[key] === (string)a2[key]
对每个 keys。返回从 a1 到 a2 的“补丁”。null
值表示我们需要取消设置此键。compare(a1, a2, keys)
a1 和 a2 预期是数组的数组。返回补丁,说明与 a1 相比 a2 中发生了什么更改 - 包含键的数组created
:应该创建哪些项目及其值updated
:应该更新哪些项目及其更新字段removed
:应该删除哪些项目(ID)
compareFlat(a1, a2)
与compare
类似,但 a1 和 a2 被视为标量,并完全比较,而不是按字段比较
ArrayFactory
createKeys(keys, value)
:创建具有这些键和值的数组createDictionary(a, keyColumn, valueColumn)
:类似于array_column(a, valueColumn, keyColumn)
,但不需要所有项目都具有值(?? null
)
ArrayKeysHelper
index($a, array|string $keys = 'id')
:创建索引数组,其中索引可能包含多个字段indexAndGroup($a, array|string $keys = 'id')
:创建索引数组,但允许有相同索引的多个项目fill($a, $keys, $defaultValue = null)
:确保数组中所有键都存在,其他所有键都缺失filter($a, $keys, $createMissingKeys = true)
:从数组中获取这些键unset($a, $keys)
:从每个数组项中取消设置这些键
ArrayRandom
pick(array $items)
:从数组中选择随机值pickMultiple(array $items, int $count = 1, bool $preserveKeys = false, mixed $default = [])
:从数组中选择多个($count)随机值
ArrayTable
arrayToKeyValues(array $data)
:将表(如 TSV;第一个项目是包含键的标题)转换为具有命名键的数组
ArrayUniquer
values(array $a)
:uniq -> valuesnotNullValues(array $a)
:过滤非空 -> uniq -> valuescolumnValues(array $a, string $column)
:column -> uniq -> valuesmergeValues(...$a)
:merge -> uniq -> valuesmergeNotNullValues(...$a)
:merge -> 过滤非空 -> uniq -> values
FloatArrayFactory
createPreserveKeys(array $a)
:确保所有值都是浮点数create(array $a)
:确保所有值都是浮点数 -> values
IntArrayFactory
createPreserveKeys(array $a)
:确保所有值都是整数create(array $a)
:确保所有值都是整数 -> values
Balancer
要解决的问题:你有一些项目,需要将它们分配到一些桶中。你可以配置不同的策略来分配你的项目到桶中。桶应该实现BucketInterface
,平衡器应该实现BalancerInterface
半随机平衡器
它不是完全随机,你可以设置种子,所以使用相同种子和相同项目的多次运行将产生相同的结果。
公平平衡器
尝试使相同桶中的项目权重计数相同。
示例:A/B 测试,你希望将 90% 的用户发送到“A”页面,10% 发送到“B”页面。你可以使用简单的随机方法,但是当用户数量较少时,你很可能会有 20 个用户都看到页面“A”,或者有 5 个用户访问“B”。那时你将很难解释概率理论。使用这个平衡器,你可以确信前 10 个用户中的 1 个会去“B”页面,而且很可能有 20 个用户中的 2 个会到达那里。