greeny/array-class

数组的目标方法

1.0.0 2015-12-02 23:18 UTC

This package is auto-updated.

Last update: 2024-09-19 05:48:42 UTC


README

数组的目标方法

目标

你有没有使用过PHP的某些原生array_*函数?那么你知道它们存在一些不一致性,其中一些只返回新数组,而另一些则修改原始数组。甚至不提参数顺序和默认值。

让我们看看这段代码

$array = [];
array_push($array, 0, 1, 2, 3);
shuffle($array);
$array = array_map(function ($item) {
	return $item * 2;
}, $array);
$array = array_filter($array);
print_r($array);

你能从第一眼看出这段代码的功能吗?嗯,你可能可以,但代码很混乱。

但是,如果我们像这样重写代码

$array = ArrayClass::from([])
	->push(0, 1, 2, 3)
	->shuffle()
	->map(function ($item) {
		return $item * 2;
	})
	->filter()
	->toArray();
	
print_r($array);

看起来好多了,对吧?而且,猜猜看,它和上面的例子做的是同样的事情,使用相同的函数,但利用了PHP 5的面向对象编程;PHP 5.6的可变参数和其他一些功能。

有人可能会争辩说,使用这个类工作不会像使用数组那样,但我也有解决办法!

$array = ArrayClass::from([]);

// you can count elements natively
count($array);

// iterate over elements
foreach ($array as $key => $value) {
	// do stuff
}

// and even modify some of them!
$array[1] = 4;
$array[2] = $array[3] * isset($array[4]) ? $array[4] : 4;
unset($array[5]);

所以你以为这就是我能给你的所有东西吗?错了!看看所有这些内置的酷炫特性

  • 更严格的代码(每个比较都是通过===而不是==完成的,这也适用于in_arraysearchkeys
  • 更大的数组支持:每个与普通数组一起工作的方法也可以接受ArrayClass或实现Traversable的对象
  • 使用$arrayClass->cloneArray()返回新的克隆或使用$arrayClass->cloneRef($original)保存原始对象并返回克隆
  • 自动回调检查,当传入的回调不可调用时抛出异常
  • 简洁且易于阅读的API,具有流畅的接口
  • 使用toArray()方法转换为普通数组
  • 对象访问($arrayClass->foo$arrayClass['foo']相同)
  • 还有很多其他功能!

那么你在等什么呢?

哦,你可能不知道如何初始化这个玩意儿?

好吧,简单地将ArrayClass.php文件复制到你的工作目录并包含它

require_once __DIR__ . '/ArrayClass.php'; // path to the most awesome library ever

或者使用composer安装它(composer require greeny/array-class)并使用composer自动加载器

require_once __DIR__ . '/vendor/autoload.php';

然后你就可以开始享受它了!

// import class
use greeny\ArrayClass\ArrayClass; // yes, I know, weird namespace

$array = new ArrayClass; // initializes from empty array
$array = new ArrayClass($original); // initializes from original array
$array = ArrayClass::from($original); // same as before, good for chaining methods immidiatelly, like below:

$array = ArrayClass::from($original)->filter()->shuffle(); // etc etc

即将推出(可能)

  • 单元测试(可能存在一些尚未发现的错误)
  • 有什么想法?请通过创建问题来告诉我!

方法索引

几乎所有的ArrayClass提供的方法都只是封装了一些原生PHP函数来处理数组。如果这样做,只包括封装的PHP函数的名称,参数与原始函数相同(除了第一个数组参数,它表示你正在处理的数组,由ArrayClass表示)。

  • changeKeyCase$case)= array_change_key_case
  • chunk$size, $preserveKeys = FALSE)= array_chunk
  • column$key, $indexKey = NULL)= array_column
  • countValues = array_count_values
  • diffAssoc...$array)= array_diff_assoc
  • diffKey...$array)= array_diff_key
  • diffUassoc$callback, ...$array)= array_diff_uassoc
  • diff...$array)= array_diff
  • filter$callback = NULL, $flags = 0)= array_filter
  • flip = array_flip
  • intersectAssoc...$array)= array_intersect_assoc
  • intersectKey...$array)= array_intersect_key
  • intersectUassoc$callback, ...$array)= array_intersect_uassoc
  • intersectUkey ($callback, ...$array) = array_intersect_ukey
  • intersect (...$array) = array_intersect
  • keyExists ($key) = array_key_exists
  • keys ($search = NULL, $strict = TRUE) = array_keys
  • map ($callback, ...$array) = array_map
  • mergeRecursive (...$array) = array_merge_recursive
  • merge (...$array) = array_merge
  • multisort ($order = SORT_ASC, $flags = SORT_REGULAR, ...$args) = array_multisort
  • pad ($size, $value) = array_pad
  • pop = array_pop
  • product = array_product
  • push (...$values) = array_push
  • rand ($num = 1) = array_rand
  • reduce ($callback, $initial = NULL) = array_reduce
  • replaceRecursive (...$array) = array_replace_recursive
  • replace (...$array) = array_replace
  • reverse ($preserveKeys = FALSE) = array_reverse
  • search ($needle, $strict = TRUE) = array_search
  • shift = array_shift
  • slice ($offset, $length = NULL, $preserveKeys = FALSE) = array_slice
  • splice ($offset, $length = 0, $replacement = []) = array_splice
  • sum = array_sum
  • udiffAssoc ($callable, ...$array) = array_udiff_assoc
  • udiffUassoc ($valueCallable, $keyCallable, ...$array) = array_udiff_uassoc
  • udiff ($callable, ...$array) = array_udiff
  • uintersectAssoc ($callable, ...$array) = array_uintersect_assoc
  • uintersectUassoc ($valueCallable, $keyCallable, ...$array) = array_uintersect_uassoc
  • uintersect ($callable, ...$array) = array_uintersect
  • unique ($sort = SORT_STRING) = array_unique
  • unshift (...$value) = array_unshift
  • values = array_values
  • walkRecursive ($callback, $userData = NULL) = array_walk_recursive
  • walk ($callback, $userData = NULL) = array_walk
  • arsort ($sort = SORT_REGULAR) = arsort
  • asort ($sort = SORT_REGULAR) = asort
  • current = current
  • each = each
  • end = end
  • has ($needle, $strict = TRUE) = in_array
  • key = key
  • krsort ($sort = SORT_REGULAR) = krsort
  • ksort ($sort = SORT_REGULAR) = ksort
  • natCaseSort = natcasesort
  • natSort = natsort
  • next = next
  • prev = prev
  • reset = reset
  • rsort ($sort = SORT_REGULAR) = rsort
  • shuffle = shuffle
  • sort ($sort = SORT_REGULAR) = sort
  • uasort ($callable) = uasort
  • uksort ($callable) = uksort
  • usort ($callable) = usort

此外,还有一些实用方法

  • combineKeysWith ($values) - 等同于调用 array_combine($array, $values)
  • combineValuesWith ($keys) - 等同于调用 array_combine($keys, $array)
  • cloneArray - 返回 ArrayClass 的克隆
  • cloneRef (&$ref) - 返回 ArrayClass 的克隆,同时将原始 ArrayClass 设置为 $ref
  • toArray - 将 ArrayClass 转换为原生数组
  • getIndex ($index) - 返回目标索引的值
  • setIndex ($index, $value) - 在目标索引处设置值
  • issetIndex ($index) - 判断索引是否已设置
  • unsetIndex ($index) - 取消索引设置

以及一些以静态方法开始的

  • ArrayClass::combine ($keys, $values) - 从 array_combine($keys, $values) 的结果创建新的 ArrayClass
  • ArrayClass::fillKeys ($array, $value) - 从 array_fill_keys($array, $value) 的结果创建新的 ArrayClass
  • ArrayClass::fill ($start, $num, $value) - 从 array_fill($start, $num, $value) 的结果创建新的 ArrayClass
  • ArrayClass::range ($start, $end, $step = 1) - 从 range($start, $end, $step) 的结果创建新的 ArrayClass