ckr / arraymerger
提供递归合并数组的功能
3.0.0
2022-04-23 20:26 UTC
Requires
- php: >=7.0
Requires (Dev)
- phpspec/phpspec: ~7.2
This package is not auto-updated.
Last update: 2024-09-10 03:42:06 UTC
README
这是一个简单的工具,用于递归合并PHP数组。它只是一个类,提供静态方法。或者,你可以创建一个实例,配置它,然后调用实例方法。
兼容性
当前库与php-7.0至php-8.1兼容。如果你需要支持php-5.5至php-7.0,请使用版本2.0.0。如果你需要支持php-5.4,请使用版本1.0.0。
基本用法
// the default array has lower priority $default = array(0 => 'a', 1 => 'b', 'x' => 'z'); // the values of the $precedence array have higher priority than // the values of the $default array $precedence = array(0 => 'a', 'x' => 'y', 'y' => 'y'); // use the static method... $merged = \Ckr\Util\ArrayMerger::doMerge($default, $precedence); // ... or create an object and call the instance method $obj = new \Ckr\Util\ArrayMerger($default, $precedence); $merged = $obj->mergeData(); print_r($merged); /* Array ( [0] => a // from $default [1] => b // from $default [x] => y // from $precedence (overwrite value from $default) [2] => a // from $precedence[0] (values associated to numeric keys get appended by default) [y] => y // from $precedence (new value, associated to string key) ) */
具有多维输入数组的另一个简单示例
$default = array('outer' => array('a' => 'a', 'b' => 'b')); $precedence = array('outer' => array('b' => 'x')); $merged = \Ckr\Util\ArrayMerger::doMerge($default, $precedence); print_r($merged); /* Array ( [outer] => Array ( [a] => a // from $default [b] => x // from $precedence, overwriting $default['outer']['b'] ) ) */
配置
有三个标志可用于确定合并操作的精确行为
/** * Given the default array has a scalar value 'v' at key 'k' and * the precedence array has a sub array at the same key 'k'. * * If flag is set, the default scalar value 'v' is wrapped in * an array [0 => 'v'] before the merge is done. * * If the flag is NOT set, then an exception is thrown. * * Default: not set */ const FLAG_ALLOW_SCALAR_TO_ARRAY_CONVERSION = 1; /** * If flag is set, the value of the precedence array for a given key * will overwrite the value of the default array for the same key. * * If flag is NOT set, the value of the precedence array is appended * to the default array. (or skipped, depending on * FLAG_PREVENT_DOUBLE_VALUE_WHEN_APPENDING_NUMERIC_KEYS) * * Default: not set */ const FLAG_OVERWRITE_NUMERIC_KEY = 2; /** * It flag is set, a value of the precedence array for a numeric key is * only appended, if it does not exist yet in the default array. * * If flag is NOT set, the value of the precedence array is appended * to the default array (or overwrites the default array's value with the same key, * depending on FLAG_ALLOW_SCALAR_TO_ARRAY_CONVERSION) * * This flag has the lower priority as FLAG_OVERWRITE_NUMERIC_KEY, i.e. if * FLAG_OVERWRITE_NUMERIC_KEY is set, then it doesn't matter what the value of * FLAG_PREVENT_DOUBLE_VALUE_WHEN_APPENDING_NUMERIC_KEYS is * (the value is added to the default array at the given index, regardless of other values * in the array) * * Note that this flag may slow down the operation on very large (default) arrays. * * Default: not set */ const FLAG_PREVENT_DOUBLE_VALUE_WHEN_APPENDING_NUMERIC_KEYS = 4;
配置值通过标志应用。你可以在传递给构造函数或静态方法之前组合它们
$flags = \Ckr\Util\ArrayMerger::FLAG_ALLOW_SCALAR_TO_ARRAY_CONVERSION | \Ckr\Util\ArrayMerger::FLAG_OVERWRITE_NUMERIC_KEY; $merged = \Ckr\Util\ArrayMerger::doMerge($default, $precedence, $flags);
如果你使用类的实例,你可以动态设置和删除标志
$default = array(0 => 'a', 1 => 'b', 'x' => 'z'); $precedence = array(0 => 'a', 'x' => 'y', 'y' => 'y'); $obj = new \Ckr\Util\ArrayMerger($default, $precedence); $merged = $obj->allowConversionFromScalarToArray(true) ->overwriteNumericKey(true) ->mergeData(); $merged2 = $obj->overwriteNumericKey(false)->mergeData(); echo count($merged); // 4 echo count($merged2); // 5
更多示例,请参阅phpSpec方法。