rexlabs/utility-belt

一组在PHP中处理数据、集合(数组的数组)和数组的实用工具

4.0.0 2023-07-19 13:53 UTC

This package is auto-updated.

Last update: 2024-09-19 16:18:28 UTC


README

这个库目前没有活跃开发。许多其他集合库提供了我们需要的几乎所有功能。

仅修复错误。

UtilityBelt

Software License Build Status Coverage Status

每次我们开始一个新的PHP项目,该项目需要处理一些数据,我们都会发现自己一遍又一遍地重写相同的辅助函数。

此包提供了一些关键函数,使得执行常见任务(如)更容易:

  • 在数组的集合中查找和过滤值
  • 根据属性对集合中的值进行分组
  • 从深层嵌套的关联数组中提取值
  • 递归数组映射
  • 确定数组是否为关联数组
  • 等等...

这些函数都提供,而不引入任何重型框架依赖项或第三方包。

安装

使用以下命令安装最新版本:

$ composer require rexlabs/utility-belt

CollectionUtility

filterWhere / filterWhereNot

(array $items, array $properties)

一些极其常见的功能涉及根据属性列表过滤集合(行数组)。通过array_filter执行此操作所需的代码往往相当庞大,使得底层代码的目的更难以理解。这些函数提供了执行此类过滤的更简单方式。

以下所有比较都可以作为不区分大小写的检查或严格检查运行。

$items = [
    [
        "name"=>"john",
        "age"=>18
    ],
    [
        "name"=>"mary",
        "age"=>19
    ],
    [
        "name"=>"william",
        "age"=>18,
        "dog"=>[
            "name"=>"betty"
        ]
    ]
];

CollectionUtility::filterWhere($items,["age"=>18])
// [["name"=>"john",...], ["name"=>"william",...]];

CollectionUtility::filterWhereNot($items,["age"=>18])
// [["name"=>"mary",...]]

CollectionUtility::filterWhere($items,["dog.name"=>"betty"])
// [["name"=>"william",...]]

CollectionUtility::filterWhere($items,[["dog.name"=>"betty"],["name"=>"john"]]);
// [["name"=>"william",...], ["name"=>"john"]]

findWhere / findWhereNot

(array $items, array $properties)

与过滤方法类似,但返回第一个匹配的结果以及可选的找到它的键。

groupByProperty / keyByProperty

(array $array, $key)

根据一个或多个属性值重新组织集合中的行。

这两种方法的区别在于,按属性键方法允许结果中每个属性只有一个行,而分组将返回一个集合数组。

$items = [
    ["name"=>"john","dog"=>["name"=>"william"]],
    ["name"=>"frank","dog"=>["name"=>"william"]],
    ["name"=>"dodd","dog"=>["name"=>"bruce"]],
];

CollectionUtility::keyByProperty($items,"dog.name")
[
   "william"=>["name"=>"frank","dog"=>["name"=>"william"]],
   "bruce"=>["name"=>"dodd","dog"=>["name"=>"bruce"]],
]

CollectionUtility::keyByProperty($items,["name","dog.name"])
[
    "john.william"=>["name"=>"john","dog"=>["name"=>"william"]],
    "frank.william"=>["name"=>"frank","dog"=>["name"=>"william"]],
    "dodd.bruce"=>["name"=>"dodd","dog"=>["name"=>"bruce"]],
]

CollectionUtility::groupByProperty($items,"dog.name")
[
    "william"=>[
        ["name"=>"john","dog"=>["name"=>"william"]],
        ["name"=>"frank","dog"=>["name"=>"william"]],
    ],
    "bruce"=>[
        ["name"=>"dodd","dog"=>["name"=>"bruce"]],
    ]
]

sort / asort

(array $array, $property, $sort_direction = self::SORT_DIRECTION_ASCENDING, $sort_flags=SORT_REGULAR)

使用属性或嵌套属性对集合进行排序

$items = [
    ["string"=>"a", "nested"=>["number"=>1]],
    ["string"=>"d", "nested"=>["number"=>3]],
    ["string"=>"c", "nested"=>["number"=>3]],
    ["string"=>"b", "nested"=>["number"=>2]],
];

CollectionUtility::sort($items, "nested.number", CollectionUtility::SORT_DIRECTION_DESCENDING, SORT_NUMERIC);
[
    ["string"=>"c", "nested"=>["number"=>3]],
    ["string"=>"d", "nested"=>["number"=>3]],
    ["string"=>"b", "nested"=>["number"=>2]],
    ["string"=>"a", "nested"=>["number"=>1]]
]

keepKeys

(array $array, array $keys, $removal_action = CollectionUtility::REMOVAL_ACTION_DELETE)

从每个集合项中删除(或null化)除了在keys参数中指定的键之外的所有键

$items = [
    ["animal"=>"dog","name"=>"John","weather"=>"mild"],
    ["animal"=>"cat","name"=>"William"]
];

CollectionUtility::keepKeys($items, ["animal","weather"], CollectionUtility::REMOVAL_ACTION_DELETE);
[
    ["animal"=>"dog", "weather"=>"mild"],
    ["animal"=>"cat"]
]

CollectionUtility::keepKeys($items, ["animal","weather"], CollectionUtility::REMOVAL_ACTION_NULLIFY);
[
    ["animal"=>"dog", "name"=>null, ""weather"=>"mild"],
    ["animal"=>"cat", "name"=>null]
]

removeKeys

(array $array, array $keys, $removal_action = CollectionUtility::REMOVAL_ACTION_DELETE)

在每个集合项中删除(或null化)$keys参数中提供的任何键。

$items = [
    ["animal"=>"dog","name"=>"John","weather"=>"mild"],
    ["animal"=>"cat","name"=>"William"]
];

CollectionUtility::removeKeys($items, ["animal","weather"], CollectionUtility::REMOVAL_ACTION_DELETE);
[
    ["name"=>"John"],
    ["name"=>"William"]
]

random

(array $array)

从数组中获取一个随机项

shuffle

(array $array)

洗牌数组并返回结果

ArrayUtility

dotRead

(array $array, $property, $default_value=null)

$array = [
    "a"=>[
        "very"=>[
            "deep"=>[
                "hole"=>"with a prize at the bottom"
            ]
        ]
    ]
]

ArrayUtility::dotRead($array, "a.very.shallow.hole", "no prize!")
"no prize!"

ArrayUtility::dotRead($array, "a.very.deep.hole")
"with a prize at the bottom"

dotWrite

(array $array, $property, $value)

原始数组

$array = [
    "a"=>[
        "very"=>[
            "deep"=>[
                "hole"=>"with a prize at the bottom"
            ]
        ]
    ],
    "i"=>[
        "like"=>"candy"
    ]
]

返回一个包含更新属性的新数组

$array = ArrayUtility::dotWrite($array, "a.very.deep.hole", "no prize!");
$array - ArrayUtility::dotWrite($array, "i.like", ["carrots","broccoli"]);

数组现在是

$array = [
    "a"=>[
        "very"=>[
            "deep"=>[
                "hole"=>"no prize!"
            ]
        ]
    ],
    "i"=>[
        "like"=>["carrots","broccoli"]
    ]
]

设置新属性

$array = ArrayUtility::dotWrite($array, "a.very.shallow.hole", "that may contain a prize!");
$array = ArrayUtility::dotWrite($array, "i.also.like", "blue skies");

数组现在是

$array = [
    "a"=>[
        "very"=>[
            "deep"=>[
                "hole"=>"no prize!"
            ]
        ]
    ],
    "a"=>[
        "very"=>[
            "shallow"=>[
                "hole"=>"that may contain a prize!"
            ]
        ]
    ],
    "i"=>[
        "like"=>["carrots","broccoli"]
        "also"=>[
            "like"=>"blue skies"
        ]
    ]
]

dotMutate

(array $array, $property, $value)

此方法类似于 dotWrite(),但数组是通过引用传递的,因此属性更改会直接修改给定的数组。

原始数组

$array = [
    "a"=>[
        "very"=>[
            "deep"=>[
                "hole"=>"with a prize at the bottom"
            ]
        ]
    ],
    "i"=>[
        "like"=>"candy"
    ]
]

使用更新的属性修改数组

ArrayUtility::dotMutate($array, "a.very.deep.hole", "no prize!");
ArrayUtility::dotMutate($array, "i.like", ["carrots","broccoli"]);

数组现在是

$array = [
    "a"=>[
        "very"=>[
            "deep"=>[
                "hole"=>"no prize!"
            ]
        ]
    ],
    "i"=>[
        "like"=>["carrots","broccoli"]
    ]
]

设置新属性

ArrayUtility::dotMutate($array, "a.very.shallow.hole", "that may contain a prize!");
ArrayUtility::dotMutate($array, "i.also.like", "blue skies");

数组现在是

$array = [
    "a"=>[
        "very"=>[
            "deep"=>[
                "hole"=>"no prize!"
            ]
        ]
    ],
    "a"=>[
        "very"=>[
            "shallow"=>[
                "hole"=>"that may contain a prize!"
            ]
        ]
    ],
    "i"=>[
        "like"=>["carrots","broccoli"]
        "also"=>[
            "like"=>"blue skies"
        ]
    ]
]

flatten / inflate

(array $array)

$items = [
    "a"=>[
        "name"=>"jimmy",
        "fruits"=>["apple","banana"]
    ],
    "b"=>[
        "name"=>"william",
        "age"=>18,
        "dog"=>[
            "name"=>"betty"
        ]
    ]
]

ArrayUtility::flatten($items);
[
    "a.name"=>"jimmy",
    "a.fruits"=>["apple","banana"], //by default these are not flattened
    "b.name"=>"william",
    "b.age"=>18,
    "b.dog.name"=>"betty"
]

ArrayUtility::inflate($flattenedArray);
[
    "a"=>[
        "name"=>"jimmy",
        "fruits"=>["apple","banana"]
    ],
    "b"=>[
        "name"=>"william",
        "age"=>18,
        "dog"=>[
            "name"=>"betty"
        ]
    ]
]

isAssoc

(array $array)

快速测试以确定数组是否为关联数组。

ArrayUtility::isAssoc(["a"=>1,"b"=>2])
true

ArrayUtility::isAssoc(["a","b"])
false

keepKeys

(array $array, array $keys, ArrayUtility::REMOVAL_ACTION_DELETE)

与CollectionUtility::keepKeys相同,但操作的是基本数组而不是数组集合。

removeKeys

(array $array, array $keys, ArrayUtility::REMOVAL_ACTION_DELETE)

与CollectionUtility::removeKeys相同,但操作的是基本数组而不是数组集合。

mapRecursive

(array $array, callable $callback, $map_arrays = false)

类似于数组遍历递归,但不会修改数组。同时,回调函数接收三个参数:$value, $key, $array

map

(array $array, callable $callback)

类似于array_map,但回调函数接收三个参数:$value, $key, $array

first

(array $array)

返回数组的第一个元素。比reset()更有用,因为它可以处理函数的结果。

last

(array $array)

返回数组的最后一个元素。比end()更有用,因为它可以处理函数的结果。

firstKey

(array $array)

返回数组第一个元素的键。

lastKey

(array $array)

返回数组最后一个元素的键。

安装

使用Composer安装 UtilityBelt

$ composer require rexlabs/utility-belt

测试

UtilityBelt 包含一个 PHPUnit 测试套件。要从项目目录中运行测试,请执行以下命令。

$ composer test

致谢

许可

MIT 许可证(MIT)。有关更多信息,请参阅 LICENSE