hi-folks / array
Arr类用于管理数组,Table类用于管理二维数组,基于PHP数组函数构建。
Requires
- php: ^8.1|^8.2|^8.3
Requires (Dev)
- laravel/pint: ^1.2
- pestphp/pest: ^2
- phpstan/phpstan: ^1.6
- rector/rector: ^1
README
此包提供了2个类
Arr类
Arr暴露了创建、管理、访问数组数据结构的方法。
接口(方法名称、方法参数)与JavaScript Array类非常相似。
我创建这个类是因为比较JavaScript和PHP的数组方法函数,我认为(我的个人看法)JS的一个更流畅,有良好的开发者体验(但,再次强调,这是个人意见)。
Arr类提供了一些方法
- make() 创建数组;
- fromFunction(): 从函数创建Arr;
- fromValue(): 从值创建Arr;
- length(): 数组的长度/大小;
- arr(): 返回类型为PHP数组的数组;
- get(): 通过索引获取元素;
- getArr(): 通过索引获取元素(作为Arr::class实例,对于嵌套数组很有帮助);
- 迭代器方法:current(), next(), prev(), key(), valid(), rewind();
- forEach(): 对每个元素执行一个函数;
- push(): 添加新元素(在末尾);
- pop(): 移除一个元素(在末尾);
- unshift(): 在开始处添加新元素;
- shift(): 从开始处移除一个元素;
- append(): 将数组附加到当前数组上;
- concat(): 返回通过连接更多数组、Arr对象或标量变量形成的新数组;
- join(): 将所有元素连接成一个字符串;
- slice(): 返回子数组;
- indexOf(): 查找第一个出现的位置;
- lastIndexOf(): 查找最后一个出现的位置;
- every(): 所有元素匹配一个fn();
- some(): 至少有一个元素匹配一个fn();
- filter(): 通过fn()过滤元素;
- map(): 对每个元素应用fn();
- flat(): 将数组中的数组扁平化;
- flatMap(): map()和flat();
- fill(): 填充数组(或数组的一部分);
- reduce(): 使用数组作为输入计算fn();
- reduceRight(): 类似于reduce(),但以逆序解析数组;
- reverse(): 反转数组;
- sort(): 排序数组;
- splice(): 修改数组的内容,通过删除、替换和添加元素;
- toString(): 数组的字符串表示(与join(',')相同);
- isArray(): 检查输入是否为数组;
- from(): 用于从字符串或类似数组的对象创建新的Arr;
- findIndex(): 用于查找元素的索引;
- find(): 返回数组中第一个满足测试函数的元素;
- entries(): 返回一个新的Arr对象,包含数组中每个索引的键/值对;
- copyWithin(): 将数组的一部分复制到位置,但保持原始长度。
- isEmpty(): 检查提供的数组是否为空;
- values(): 创建一个新的Arr对象,包含当前对象的值(键被忽略);
- set(): 能够使用特定的键将元素设置到数组中;
- unset(): 能够通过键删除元素。
《get()` 方法
《get()` 方法支持使用点(或自定义)符号的键/索引来从嵌套数组中检索值。例如
$fruits = Arr::make([ 'green' => [ 'kiwi' => '🥝', 'mango' => '🥭' ], 'red' => [ 'strawberry' => '🍓', 'apple' => '🍎' ], 'yellow' => [ 'lemon' => '🍋', 'banana' => '🍌', ] ]); $fruits->get('red'); // 🍓,🍎 $fruits->get('red.strawberry'); // 🍓
您可以使用不同的字符来自定义符号
$fruits->get('red#strawberry', charNestedKey: '#'); // 🍓
当键不存在时,您可以定义一个默认值
$fruits->get('red#somestrangefruit', '🫠', '#'); // 🫠
《getArr()` 方法
如果您需要管理一个复杂的数组(嵌套数组)或从复杂的 JSON 结构中获取的数组,您可以访问数组的一部分并获取 Arr 对象。因为在复杂数组的情况下,`get()` 方法可能会返回一个经典数组。
让我们看一个例子
$arr = Arr::make( [ "avocado" => [ 'name' => 'Avocado', 'fruit' => '🥑', 'wikipedia' => 'https://en.wikipedia.org/wiki/Avocado' ], "apple" => [ 'name' => 'Apple', 'fruit' => '🍎', 'wikipedia' => 'https://en.wikipedia.org/wiki/Apple' ], "banana" => [ 'name' => 'Banana', 'fruit' => '🍌', 'wikipedia' => 'https://en.wikipedia.org/wiki/Banana' ], "cherry" => [ 'name' => 'Cherry', 'fruit' => '🍒', 'wikipedia' => 'https://en.wikipedia.org/wiki/Cherry' ], ] ); $appleArr = $arr->getArr("apple") // $appleArr is an Arr instance so that you can access // to the Arr methods like count() $arr->getArr("apple")->count();
《set()` 方法
《set()` 方法支持使用点(或自定义)符号的键来为嵌套数组设置值。如果键不存在,`set()` 方法将创建一个新的键并设置值。如果键已存在,`set()` 方法将替换与该键相关的值。
例如
$articleText = "Some words as a sample sentence"; $textField = Arr::make(); $textField->set("type", "doc"); $textField->set("content.0.content.0.text", $articleText); $textField->set("content.0.content.0.type", "text"); $textField->set("content.0.type", "paragraph");
所以当您尝试设置一个嵌套键为 "content.0.content.0.text" 时,它将创建嵌套数组中的元素。所以如果您尝试转储 $textField
数组的值,您将看到以下结构
var_dump($textField->arr());
array(2) {
["type"]=>
string(3) "doc"
["content"]=>
array(1) {
[0]=>
array(2) {
["content"]=>
array(1) {
[0]=>
array(2) {
["text"]=>
string(31) "Some words as a sample sentence"
["type"]=>
string(4) "text"
}
}
["type"]=>
string(9) "paragraph"
}
}
}
Table 类
Table 类允许您管理二维数组,类似于
[
['product' => 'Desk', 'price' => 200, 'active' => true],
['product' => 'Chair', 'price' => 100, 'active' => true],
['product' => 'Door', 'price' => 300, 'active' => false],
['product' => 'Bookcase', 'price' => 150, 'active' => true],
['product' => 'Door', 'price' => 100, 'active' => true],
]
Table 中的每一行都将为 Arr
类型,因此它允许您使用 Arr
对象中所有可用的方法。
Table 类 允许您过滤、排序、选择某些字段、创建计算字段。以下方法
- select(): 选择一些字段
- except(): 排除一些字段
- where(): 过滤数据
- groupBy(): 数据分组
- transform(): 使用提供的函数转换特定字段
- orderBy(): 排序数据(升序或降序)
- toArray(): 将 Table 对象转换为原生 PHP 数组
Table
现在实现了 \Countable
和 \Iterator
,这允许您计算行数并使用常规循环遍历行。
安装
您可以通过 composer 安装此包
composer require hi-folks/array
使用
要查看一些示例,我建议您查看 examples/cheatsheet.php 文件,其中包含许多示例和用例。
快速入门
// Load the vendor/autoload file require("./vendor/autoload.php"); // import the Arr class: use HiFolks\DataType\Arr; // use static make method to create Arr object $arr = Arr::make(); $arr->push('Hi'); $arr->push('Folks'); echo $arr->length(); // to access to the "native" PHP array: print_r($arr->arr());
创建一个包含随机值的数组
require("./vendor/autoload.php"); use HiFolks\DataType\Arr; $arr = Arr::fromFunction(fn () => random_int(0, 100), 500);
您可以直接访问元素,就像原生数组一样,但您也有 Arr 方法
require("./vendor/autoload.php"); use HiFolks\DataType\Arr; $arr = Arr::make(); $arr[] = "First element"; $arr[] = "Second element"; $count = $arr->length(); // output: 2 $arr->reverse(); echo $arr[0]; // output: Second element
Table 类的使用
从
[
['product' => 'Desk', 'price' => 200, 'active' => true],
['product' => 'Chair', 'price' => 100, 'active' => true],
['product' => 'Door', 'price' => 300, 'active' => false],
['product' => 'Bookcase', 'price' => 150, 'active' => true],
['product' => 'Door', 'price' => 100, 'active' => true],
]
我想 过滤 价格大于 100 的行,选择 只有 "product" 和 "price" 字段,并为每一行 创建一个新字段,名为 "new_field",它是一个计算字段(价格的两倍)
use HiFolks\DataType\Table; $dataTable = [ ['product' => 'Desk', 'price' => 200, 'active' => true], ['product' => 'Chair', 'price' => 100, 'active' => true], ['product' => 'Door', 'price' => 300, 'active' => false], ['product' => 'Bookcase', 'price' => 150, 'active' => true], ['product' => 'Door', 'price' => 100, 'active' => true], ]; $table = Table::make($dataTable); $arr = $table ->select('product' , 'price') ->where('price', ">", 100) ->calc('new_field', fn ($item) => $item['price'] * 2);
结果是
HiFolks\DataType\Table::__set_state(array(
'rows' =>
array (
0 =>
HiFolks\DataType\Arr::__set_state(array(
'arr' =>
array (
'product' => 'Desk',
'price' => 200,
'new_field' => 400,
),
)),
1 =>
HiFolks\DataType\Arr::__set_state(array(
'arr' =>
array (
'product' => 'Door',
'price' => 300,
'new_field' => 600,
),
)),
2 =>
HiFolks\DataType\Arr::__set_state(array(
'arr' =>
array (
'product' => 'Bookcase',
'price' => 150,
'new_field' => 300,
),
)),
),
))
测试
composer test
变更日志
请参阅 变更日志 了解最近的变化。
贡献
请参阅 贡献指南 了解详细信息。
安全漏洞
请查阅 我们的安全策略 了解如何报告安全漏洞。
鸣谢
许可
MIT 许可证(MIT)。有关更多信息,请参阅 许可文件。