jstewmc / php-helpers
PHP 中帮助处理数字、字符串、数组、文件和布尔值的静态类
Requires
- php: ^7.3 || ^8.0
Requires (Dev)
- mikey179/vfsstream: ^1.6
- phpunit/phpunit: ^9
- roave/security-advisories: dev-latest
- slevomat/coding-standard: ^6
This package is auto-updated.
Last update: 2024-09-05 01:49:33 UTC
README
PHP 辅助工具
静态辅助类,用于处理 PHP 字符串、数组、数字、文件和布尔值。
PHP 中的静态辅助类并不新鲜。实际上,这些函数中的许多可能已经在我的库之外的其他更好的库中编写过数十次。然而,我在处理一个需要尽可能少的依赖的项目时,编写(或从网络复制并注明来源)了这些函数,并认为它们值得分享。
安装
此库需要 PHP 7.4+。
它是跨平台的,我们努力使它能够在 Windows、Linux 和 OSX 上同样良好地运行。
它应通过 Composer 安装。为此,将以下行添加到您的 composer.json
文件的 require
部分,并运行 composer update
{ "require": { "jstewmc/php-helpers": "^0.2" } }
用法
以下是最常用函数的示例。
(请注意,我已省略必要的 use Jstewmc\PhpHelpers\{Arr, Boolean, Dir, Num, Str};
语句以保持示例简洁。)
数字(即 "Num")
您可以使用 val()
方法将整数、浮点数、分数(例如,"1/2"
)、混合数(例如,"1 1/2"
)、逗号分隔值(例如,"1,000"
)和用英语表示的数字(例如,"two hundred and fifty-six"
)转换为它们的数值等效物
Num::val('1/2'); // returns (float) 0.5 Num::val('1,000'); // returns (int) 1000 Num::val('one hundred'); // returns (int) 100 Num::val('two million, ninety-seven thousand, one hundred and fifty-two'); // returns (int) 2,097,152
您可以使用 *To()
方法将数字四舍五入、向上取整或向下取整到另一个数的最近倍数
Num::roundTo(7, 10); // returns 10 Num::ceilTo(7, 10); // returns 10 Num::floorTo(7, 10); // returns 0
您可以使用 bound()
方法保持数字大于等于下限、小于等于上限,或两者都满足
Num::bound(1, 10); // returns 10, because 1, the number, is less than 10, the lower bound Num::bound(10, 1, 5); // returns 5, because 10, the number, is greater than 5, the upper bound
您可以使用 normalize()
方法根据最大值索引数字
Num::normalize(1, 10); // returns 0.1 Num::normalize(5, 10); // returns 0.5 Num::normalize(10, 10); // returns 1
您可以使用 isNumeric()
方法检查一个值是否是数字,包括分数、混合数和英语短语
Num::isNumeric(1); // returns true Num::isNumeric('1/2'); // returns true Num::isNumeric('1 1/2'); // returns true Num::isNumeric('one hundred'); // returns true Num::isNumeric('foo'); // returns false
您可以使用 isInt()
方法检查一个数字或字符串是否是整数
Num::isInt('1,000'); // returns true Num::isInt(1000); // returns true
您可以使用 isId()
方法检查一个数字是否是有效的数据库标识符(即,正整数,可选地具有正确的数据类型大小)
Num::isId('foo'); // returns false Num::isId(1.5); // returns false Num::isId(1); // returns true Num::isId(1, 'tinyint'); // returns true Num::isId(999, 'tinyint'); // returns false (too big)
您可以使用 isZero()
方法检查一个值是否为零(在像 PHP 这样的弱类型语言中,零可以是许多东西)
Num::isZero(0); // returns true Num::isZero('0'); // returns true Num::isZero(false); // returns false
您可以使用 almostEqual()
方法检查两个浮点数是否“相等”(因为浮点数在内存中的存储方式,您不应直接使用 ==
或 ===
运算符进行比较)
Num::almostEqual(0.2, 0.2); // returns true Num::almostEqual(0.2, 0.3); // returns false
字符串(即 "Str")
您可以使用 rand()
生成指定长度的随机字符串,可选地使用特定的拉丁字符集(允许的字符集为 'lower'
、'upper'
、'alpha'
('lower' + 'upper'
的快捷方式)、number
或 symbol
)
Str::rand(8); // returns a string like '9#hb%Fv3' Str::rand(8, ['upper', 'number']); // returns a string like 'P9K7HG32'
您可以使用 password()
生成随机字符串,可选地包含必须从拉丁字符集中出现的最小字符数
Str::password(8); // returns a string like 'jNb^3#L@' Str::password(8, ['upper' => 8]); // returns a string like 'NBDRATCV', with exactly eight upper-case characters Str::password(16, ['number' => 8]); // returns a string like '*9f8F6b4F3f1:0/9', with at least eight numbers
您可以使用 truncate()
整洁地裁剪字符串到或接近所需的长度(默认情况下,换行符是空格字符(' '
),填充是省略号('...'
))
Str::truncate('Lorem ipsum inum', 10); // returns 'Lorem...', because the "u" in "ipsum" is the 10th character and // the space after "Lorem" is the closest break character Str::truncate('Lorem ipsum inum', 15); // returns 'Lorem ipsum...', because the "u" in "inum" is the 15th character Str::truncate('Lorem ipsum inum', 99); // returns 'Lorem ipsum inum', because the string is shorter than the limit
您可以使用 *With()
方法确定字符串是否以给定的子字符串开头或结尾
Str::endsWith('foo', 'o'); // returns true Str::iEndsWith('foo', 'O') // returns true Str::startsWith('foo', 'f'); // returns true Str::iStartsWith('foo', 'F'); // returns true
您可以使用 strtocamelcase()
方法将字符串转换为驼峰式
Str::strtocamelcase('Hello world'); // returns "helloWorld" Str::strtocamelcase('H3LLO WORLD!'); // returns "helloWorld" Str::strtocamelcase('hello_world'); // returns "helloWorld"
您可以使用 splitOnFirstAlpha()
方法在第一个字母字符处拆分字符串
Str::splitOnFirstAlpha('123 foo'); // returns ['123', 'foo'] Str::splitOnFirstAlpha('123'); // returns ['123'] Str::splitOnFirstAlpha('foo'); // returns ['foo']
您可以使用 strtobytes()
方法将 .ini
风格的字节字符串(例如,'1G'
)转换为数字
Str::strtobytes('1K'); // returns 1024 Str::strtobytes('1M'); // returns 1,048,576
您可以使用 isBool()
方法判断一个字符串是否是“布尔值”
Str::isBool('foo'); // returns false Str::isBool('yes'); // returns true
布尔值
您可以使用 booltostr()
方法将布尔值转换为字符串
Boolean::booltostr(true, 'yes/no'); // returns 'yes' Boolean::booltostr(true, 'true/false'); // returns 'true' Boolean::booltostr(true, 'on/off'); // returns 'on'
您可以使用 val()
方法将“布尔值”评估为其布尔等效值(PHP的本地boolval()
方法不支持“yes”/"no"
或“on”/"off"
字符串)
Boolean::val(true); // returns true Boolean::val('on'); // returns true Boolean::val('yes'); // returns true
数组(又称“Arr”)
您可以使用 filterByKeyPrefix()
方法根据字符串前缀过滤数组
$array = ['foo' => 1, 'bar' => 2, 'baz' => 3]; Arr::filterByKeyPrefix($array, 'b'); // returns ['bar' => 2, 'baz' => 2]
您可以使用 filterByKey()
方法通过自定义函数过滤数组
$array = ['foo' => 1, 'bar' => 2, 'baz' => 3]; Arr::filterByKey($a, function ($k) { return substr($k, 0, 1) === 'b'; }); // returns ['bar' => 2, 'baz' => 2]
您可以使用 sortByField()
方法按升序或降序对关联数组进行排序
$arrays = [['foo' => 2], ['foo' => 3], ['foo' => 1]]; Arr::sortByField($arrays, 'foo'); // returns [['foo' => 1], ['foo' => 2], ['foo' => 3]] Arr::sortByField($arrays, 'foo', 'desc'); // returns [['foo' => 3], ['foo' => 2], ['foo' => 1]]
您可以使用 sortByProperty()
或 sortByMethod()
方法按升序或降序对对象数组进行排序,分别使用属性或方法
// define a example class (for the purposes of this example, we'll define both a // public property and a getter method) class Example { public $property; public function __construct(int $value) { $this->property = $value; } public function getProperty(): int { return $this->property; } } $objects = [new Example(2), new Example(3), new Example(1)]; Arr::sortByProperty($objects, 'foo'); // returns (in pseudo-code) [{bar: 1}, {bar: 2}, {bar: 3}] Arr::sortByMethod($objects, 'getBar'); // returns (in pseudo-code) [{bar: 1}, {bar: 2}, {bar: 3}]
您可以使用 inArray()
方法使用通配符符号(默认通配符字符为星号 "*"
)在数组中搜索值
$values = ['foo', 'bar', 'baz']; Arr::inArray($values, 'f*'); // returns true, because of the leading "f" in "foo" Arr::inArray($values, '*z'); // returns true, because of the trailing "z" in "baz" Arr::inArray($values, '*a*'); // returns true, because of the "a" in "bar" and "baz"
您可以使用 diff()
方法确定两个数组之间的Levenshtein 距离(即改变一个数组为另一个数组所需的单个元素编辑数)
$array1 = ['foo', 'bar', 'baz']; $array2 = ['bar', 'qux']; $actual = Arr::diff($array1, $array2); $expected = [ ['value' => 'foo', 'mask' => -1], // because "foo" should be deleted ['value' => 'bar', 'mask' => 0], // because "bar" should be unchanged ['value' => 'baz', 'mask' => -1], // because "baz" should be deleted ['value' => 'qux', 'mask' => 1] // because "qux" should be added ]; $actual == $expected; // returns true
您可以使用 permute()
方法计算一个数组的排列(请注意,排列的数量随着原始数组大小的阶乘增长)
$array = ['foo', 'bar', 'baz']; $actual = Arr::permute($array); $expected = [ ['foo', 'bar', 'baz'], ['baz', 'foo', 'bar'], ['bar', 'foo', 'baz'], ['foo', 'baz', 'bar'], ['bar', 'baz', 'foo'], ['baz', 'bar', 'foo'] ]; $actual == $expected; // returns true
您可以使用 isAssoc()
方法确定数组是否为关联数组(即具有字符串键)
$array1 = [0 => 'foo', 1 => 'bar']; $array2 = [0 => 'foo', 1 => 'bar', 'baz' => 'qux']; Arr::isAssoc($array1); // returns false Arr::isAssoc($array2); // returns true, because there is a string key
您可以使用 isEmpty()
方法确定数组中是否存在具有非空值的键
$values = ['foo' => null, 'bar' => [], 'baz' => 1]; Arr::isEmpty('qux', $values); // returns true, because the key "qux" does not exist Arr::isEmpty('foo', $values); // returns true, because the value of key "foo" is null Arr::isEmpty('bar', $values); // returns true, because the value of key "bar" is empty array Arr::isEmpty('baz', $values); // returns false, because the value of key "baz" is not empty
您可以使用 keyStringReplace()
方法替换数组键中的子字符串
$array = ['foo' => 'bar', 'baz' => 'qux']; Arr::keyStringReplace('f', 'g', $a); // returns ['goo' => 'bar', 'baz' => 'qux'], because "f" was replaced with "g" Arr::keyStringReplace('f', '', $a); // returns ['oo' => 'bar', 'baz' => 'qux'], because "f" was replaced with ""
目录(又称“Dir”)
您可以使用 copy()
方法复制非空目录(PHP的本地copy()
方法无法与非空目录一起使用)
$source = dirname(__FILE__).'/foo'; $destination = dirname(__FILE__).'/bar'; Dir::copy($source, $destination); // returns true
您可以使用 remove()
方法删除非空目录(PHP的本地rmdir()
方法无法与非空目录一起使用)
$directory = dirname(__FILE__).'/foo'; // The $container verifies you don't delete a directory outside of the target // area accidentally. The path of the directory to be deleted MUST start with // this path. $container = dirname(__FILE__); Dir::remove($directory, $container); // returns true
您可以使用 abs2rel()
方法将绝对路径名转换为相对路径
Dir::abs2rel('/path/to/foo/bar/baz', '/path/to'); // returns "foo/bar/baz" Dir::abs2rel('/path/to/foo/bar/baz', '/path/to/foo'); // returns "bar/baz"
许可
此库根据MIT 许可证发布。
贡献
贡献 欢迎加入!