ajant / simple-array-library
包含方便数组处理方法的简单库
Requires
- php: >=5.4.0
Requires (Dev)
- phpunit/phpunit: >=4
- satooshi/php-coveralls: ^1.0.1
README
包含方便数组处理方法的库。这些是在各种项目开发过程中自己需要创建的方法,如果您希望添加任何方法,请告诉我: ajant.github@gmail.com
要求
您需要:PHP版本5.4+
快速入门
使用composer安装最新版本
require "ajant/simple-array-library": ~4.1.0
自动加载库
use SimpleArrayLibrary/SimpleArrayLibrary
然后您就可以开始了。
使用示例
为了获得更多帮助,请查看测试,已测试额外的输入场景。addConfigRow
该方法旨在消除需要解析为PHP数组的配置文件的需求,因为这会带来显著的性能损失。它结合了ini文件的可读性,以及直接在PHP级别定义配置的速度。第一个参数表示配置数组,第二个参数表示新的配置行的嵌套键的数字数组(如果为数组关联数组,将抛出异常)。第三个参数表示正在映射的值。该方法返回添加了新行的配置,或者在相同的键组合已经使用的情况下抛出异常。
SimpleArrayLibrary::addConfigRow(array('foo' => array('baz' => 1)), array('foo', 'bar'), 2); // array('foo' => array('baz' => 1, 'bar' => 2)) $config = array(); $config = SimpleArrayLibrary::addConfigRow($config, array('foo', 'bar'), new stdClass()); $config = SimpleArrayLibrary::addConfigRow($config, array('foo', 'baz'), 1); $config = SimpleArrayLibrary::addConfigRow($config, array('foo', 3), array(1, 2)); // $config = array('foo' => array('bar' => stdClass(), 'baz' => 1, 3 => array(1, 2))) $config = SimpleArrayLibrary::addConfigRow($config, array('foo', 3), false); // exception because of repeated array('foo', 3) path
allElementsEqual
检查数组中的所有元素是否相等,以及它们是否都等于指定的值(可选)。
SimpleArrayLibrary::allElementsEqual(array(1, 1)); // true SimpleArrayLibrary::allElementsEqual(array(1, 2)); // false SimpleArrayLibrary::allElementsEqual(array(1, 1), 1); // true SimpleArrayLibrary::allElementsEqual(array(1, 1), 2); // false
castColumns
尝试将二维数组中所有行的指定列转换为指定的类型。允许的类型由常量表示:TYPE_INT,TYPE_STRING,TYPE_FLOAT,TYPE_BOOL,TYPE_ARRAY,TYPE_OBJECT。任何其他类型都会抛出异常。用户应该了解PHP中的类型转换如何工作,因为此方法不提供对可能的转换错误的保护。
第三个参数必须是布尔值,否则会抛出异常。如果第三个参数设置为true,则必须在第二个参数中定义键的列存在,否则会抛出异常。
SimpleArrayLibrary::castColumns(array(array('a' => '2')), array('a' => SimpleArrayLibrary::TYPE_INT)); // array(array('a' => 2)) SimpleArrayLibrary::castColumns(array(array()), array('a' => SimpleArrayLibrary::TYPE_INT), false); // array(array()) SimpleArrayLibrary::castColumns(array(array('a' => '1'), array('b' => 'foo')), array('a' => SimpleArrayLibrary::TYPE_INT), false); // array(array('a' => 1), array('b' => 'foo'))
countMaxDepth
递归地计算数组的最大深度(嵌套子数组的数量)。库中包含非递归方法执行相同的功能。递归方法更快,但在非常深的数组的情况下可能会引起内存使用问题。
SimpleArrayLibrary::countMaxDepth(array()); // 1 SimpleArrayLibrary::countMaxDepth(array(1, array())); // 2 SimpleArrayLibrary::countMaxDepth(array(array('foo'))); // 2
countMaxDepthIterative
计算数组的最大深度(嵌套子数组的数量)。库中包含递归方法执行相同的功能。递归方法更快,但在非常深的数组的情况下可能会引起内存使用问题。
SimpleArrayLibrary::countMaxDepthIterative(array()); // 1 SimpleArrayLibrary::countMaxDepthIterative(array(1, array())); // 2 SimpleArrayLibrary::countMaxDepthIterative(array(array('foo'))); // 2
countMinDepth
递归地计算数组的最小深度(嵌套子数组的数量)。
第二个参数必须为整数,否则会抛出异常。这是一个递归方法,第二个参数用于递归调用,不应从方法外部使用。
SimpleArrayLibrary::countMinDepth(array()); // 1 SimpleArrayLibrary::countMinDepth( array( 1, array() ) ); // 1 SimpleArrayLibrary::countMinDepth(1); // 0 SimpleArrayLibrary::countMinDepth(array(), 1); // 2
deleteColumns
从多维数组(特别是针对二维数组)的列中删除值。
SimpleArrayLibrary::deleteColumns(array(array('foo' => 2), array()), array('foo')); // array(array(), array()) SimpleArrayLibrary::deleteColumns(array(array(), array()), array('foo')); // array(array(), array()) SimpleArrayLibrary::deleteColumns(array(array('foo' => 2, 'bar' => 1), array()), array('foo', 'bar')); // array(array(), array())
getColumns
从多维数组中检索所需列的值。
第一个参数必须是数组数组的数组(矩阵),否则搜索列没有意义,将抛出异常。
第二个参数必须是可以用作数组索引的元素数组,否则将抛出异常。
第三个参数必须是布尔值,否则将抛出异常。
SimpleArrayLibrary::getColumns( array( array('a' => 1), array(1) ), array('a') ); // array('a' => array(1)) SimpleArrayLibrary::getColumns( array( array(1, 2, 3, 4), array(1, 2, 3, 4), array(1, 2, 3, 4) ), array(0 ,2) ) // array(0 => array(1, 1, 1), 2 => array(3, 3, 3)) SimpleArrayLibrary::getColumns( array( array('a' => 1), array(1) ), array('a'), true ); // UnexpectedValueException is thrown, not all rows have all required columns as was requested by the third parameter
getRectangularDimensions
此方法检查数组是否为“矩形”或换句话说,所有子数组是否具有相同数量的元素,递归地,以及递归的每一级有多少个元素,如果它是矩形的。
SimpleArrayLibrary::getRectangularDimensions(array(1)); // array(1) SimpleArrayLibrary::getRectangularDimensions(array(1, array(1))); // -1, not "rectangular" SimpleArrayLibrary::getRectangularDimensions( array( // 3 elements array( // 1 element array(1, 2, 3, 4) // 4 elements ), array( // 1 element array(1, 2, 3, 4) // 4 elements ), array( // 1 element array(1, 2, 3, 4) // 4 elements ) ) ); // array(4, 1, 3)
hasAllKeys
检查数组内部是否包含所有必需的键,无论值如何。
SimpleArrayLibrary::hasAllKeys(array('a' => 1), array('a')); // true SimpleArrayLibrary::hasAllKeys(array(), array()); // true SimpleArrayLibrary::hasAllKeys(array('b' => 1), array('a', 'b')); // false
hasAllValues
检查数组内部是否包含所有必需的值,无论键如何。值不能是数组。
SimpleArrayLibrary::hasAllValues(array('a' => 1), array(1)); // true SimpleArrayLibrary::hasAllValues(array(), array()); // true SimpleArrayLibrary::hasAllValues(array('b', 1), array('a', 'b')); // false
hasAllValuesMultiDimensional
检查数组内部是否包含所有必需的值,无论键如何。值可以是数组。
SimpleArrayLibrary::hasAllValuesMultiDimensional(array('a' => array(1)), array(array(1))); // true SimpleArrayLibrary::hasAllValuesMultiDimensional(array(array()), array(array())); // true SimpleArrayLibrary::hasAllValuesMultiDimensional(array('b', 1), array('a', 'b')); // false
hasOnlyKeys
检查数组内部是否只包含所有必需的键,没有其他键。
SimpleArrayLibrary::hasOnlyKeys(array('a' => 1, 2), array('a', 0)); // true SimpleArrayLibrary::hasOnlyKeys(array('b' => 1, 1), array('b', 0, 1)); // false SimpleArrayLibrary::hasOnlyKeys(array('b' => 1, 1), array('b')); // false
haveSameKeys
检查两个数组是否具有相同的键,无论值如何。
SimpleArrayLibrary::haveSameKeys(array('a' => 1), array('a' => 2)); // true SimpleArrayLibrary::haveSameKeys(array(), array()); // true SimpleArrayLibrary::haveSameKeys(array(1, 'a' => 1), array(2)); // false
haveSameValues
检查两个数组是否具有相同的值,无论键如何。
SimpleArrayLibrary::haveSameValues(array('a' => 1), array(1)); // true SimpleArrayLibrary::haveSameValues(array(), array()); // true SimpleArrayLibrary::haveSameValues(array(1), array(2)); // false
insertSubArray
将子数组插入到数组中,位置指向子数组键的位置
第三和第四个参数必须是布尔值,否则将抛出异常。如果第三个参数设置为true,则将覆盖数组中指向子数组键的现有值(如果有的话)。如果第三个参数设置为true,则第四个参数不使用。如果第四个参数设置为true且第三个参数设置为false,则不会更改现有值,但如果第三个和第四个参数都设置为false且子数组键指向已存在的值,则将抛出异常
SimpleArrayLibrary::insertSubArray(array('foo' => 1), array('bar' => 2)); // array('foo' => 1, 'bar' => 2) SimpleArrayLibrary::insertSubArray(array('foo' => 1), array('foo' => 2), true, false); // array('foo' => 2) SimpleArrayLibrary::insertSubArray(array('foo' => 1), array('foo' => 2), false, true); // array('foo' => 1) SimpleArrayLibrary::insertSubArray(array('foo' => 1), array('foo' => 2), false, false); // exception
isAssociative
检查数组是否有任何关联键。
SimpleArrayLibrary::isAssociative(array('a' => 1, array(1))); // true SimpleArrayLibrary::isAssociative(array(1, 1)); // false SimpleArrayLibrary::isAssociative(array()); // false
isNumeric
检查数组是否具有所有以零开始并逐个递增的数字键。
SimpleArrayLibrary::isNumeric(array('a' => 1, array(1))); // false SimpleArrayLibrary::isNumeric(array(1, 1)); // true SimpleArrayLibrary::isNumeric(array()); // false
isStructureSame
检查两个数组是否具有相同的结构(深度和键)。忽略叶节点的值,只比较键。
SimpleArrayLibrary::isStructureSame(1, 'a'); // true SimpleArrayLibrary::isStructureSame(array(1, array(1)), array(2, array(3)); // true SimpleArrayLibrary::isStructureSame(array(1, array(1)), array(1, 1)); // false SimpleArrayLibrary::isStructureSame(array(), array()); // true
isSubArray
检查数组是否是另一个数组的子数组(子数组的所有键值对是否都存在于数组中)。
第三个参数必须是布尔值,否则将抛出异常。如果第三个参数设置为true,则使用严格的比较(===)来比较数组值,否则使用常规比较(==)。
SimpleArrayLibrary::isSubArray(array(2, 1), array(2)); // true SimpleArrayLibrary::isSubArray(array('a' => 1, 'b' => array(1)), array('c' => 1)); // false SimpleArrayLibrary::isSubArray(array('a' => 1, 'b' => array(1)), array('a' => 2)); // false
selectRandomArrayElements
选择随机元素的子数组。保留键关联。如果所需随机元素的数量等于或大于原始数组成员的数量,则返回整个数组。
第二个参数必须是正整数或正整数的字符串表示,否则将抛出异常。
SimpleArrayLibrary::selectRandomArrayElements(array('foo' => 2), 1); // array('foo' => 2) SimpleArrayLibrary::selectRandomArrayElements(array(1, 2), 1); // array(1) OR array(1 => 2) SimpleArrayLibrary::selectRandomArrayElements(array('foo' => 2, 'bar'), 3); // array('foo' => 2, 'bar')
setColumn
将值设置到多维数组的列中(特别是针对二维数组,对于三维或更多维度的数组也将工作,但只会更改第二级别的元素)
第四和第五个参数必须是布尔值,否则将抛出异常。如果第四个参数设置为true,则将在缺少列的行中添加列。如果第五个参数设置为true,则将在行中覆盖已存在的列值
SimpleArrayLibrary::setColumn(array(array('foo' => 2), array()), 'foo', 1); // array(array('foo' => 1), array('foo' => 1)) SimpleArrayLibrary::setColumn(array(array('foo' => 2), array()), 'foo', 1, false, false); // array(array('foo' => 2), array()) SimpleArrayLibrary::setColumn(array(array('foo' => 2), array()), 'foo', 1, true, false); // array(array('foo' => 2), array('foo' => 1))
transpose
转置矩阵
将行转换为列,将列转换为行。这在需要将数据集重塑为报告或绘图时非常有用。
SimpleArrayLibrary::transpose(array(array(1, 2, 3). array(4, 5, 6))); // array(array(1, 4), array(2, 5), array(3, 6))