jstewmc/php-helpers

PHP 中帮助处理数字、字符串、数组、文件和布尔值的静态类

v0.2.0 2021-10-04 19:23 UTC

This package is auto-updated.

Last update: 2024-09-05 01:49:33 UTC


README

CircleCI codecov

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' 的快捷方式)、numbersymbol

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 许可证发布。

贡献

贡献 欢迎加入!