hi-folks/array

Arr类用于管理数组,Table类用于管理二维数组,基于PHP数组函数构建。

资助包维护!
Hi-Folks

v1.1.0 2024-06-13 08:25 UTC

This package is auto-updated.

Last update: 2024-09-08 23:09:27 UTC


README

PHP Array package

Latest Version on Packagist PHP Unit Tests Total Downloads Test Coverage

此包提供了2个类

  • Arr类基于PHP数组函数构建。
  • Table类允许您管理二维关联数组(类似于表格或元组)。

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)。有关更多信息,请参阅 许可文件