carloswph/foreacher

一套用于改进、操作和处理foreach循环的工具。

v1.2.0 2021-05-03 16:01 UTC

This package is auto-updated.

Last update: 2024-09-08 04:33:35 UTC


README

处理数组和数据可能会消耗资源,有时也会有些麻烦。PHP 本地提供一系列类,通过将数组转换为对象,我们可以对数据进行一系列高级查询和循环。这个库旨在简化使用ArrayIterator、InfiniteIterator、RegexIterator等类的过程,提供一种全面且友好的方式来使用它们,并将函数和方法应用于其结果。

开始使用

Iterator 类是这个库的核心。它存储所有数组在键下,这些键以后可以用来对这些数据执行操作和循环。其余的类扩展了 PHP 中的类,以支持 Iterator 类的方法。所以,首先,你可以通过提供一些数组并创建一个 Iterator 的新实例来开始。

use Foreacher\Iterator;

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

$entries =[
	'1' => [1, 3, 5, 6, 7, 11, 15, 24, 34, 56, 66, 77, 124],
	'2' => [3, 455, 5, 89, 72, 2434, 1, 1233, 4]
];

$iterator = new Iterator($entries);

一旦数组被存储,你就可以开始对它们执行操作,而不会改变或修改初始数据,这些数据仍然在 $arrays 属性下受到保护。此外,该类还有一个额外的 push($id, $data) 方法,可以在任何时候添加新的命名数组到池中。

限制循环

这个类的一个首要功能是限制循环只遍历命名数组的部分。这意味着你可以从数组的第三个值开始循环,例如。你也可以做相反的操作:只循环最后三个元素。最后,也可以从给定的元素开始循环。

那么,要应用于循环中每个元素的运算操作是什么呢?当然,当你确定循环的界限时,你可以提供一个可调用的函数。让我们看看一个例子

function echoR($item)
{
	echo $item . PHP_EOL;
	echo $item + 4 . PHP_EOL;
}

$iterator->limitFirst('1', 4, 'echoR');

// Returns: 1 5 3 7 5 9 6 10

$iterator->limitLast('1', 4, 'echoR');

// Returns: 56 60 66 70 77 81 124 128

$iterator->limitFrom('1', 4, 'echoR');

// Returns: 7 11 11 15 15 19 24 28 34 38 56 60 66 70 77 81 124 128

执行 (n) 次循环

另一种可能性是在存储的数组上使用 looping() 方法,执行部分或 (n) 次循环遍历相同的数组元素。在这种情况下,第二个参数实际上不仅接受整数,还接受浮点数。所以

function echoR($item)
{
	echo $item . PHP_EOL;
}

$iterator->looping('1', 2.5, 'echoR');

// Returns: 1 3 5 6 7 11 15 24 34 56 66 77 124 1 3 5 6 7 11 15 24 34 56 66 77 124 1 3 5 6 7 11

循环所有存储的数组

还有可能循环所有存储的数组并应用相同的函数。在这种情况下,结果将是一个数组,其中的元素实际上是子数组,它们带来了键值逻辑,其中键指的是存储的数组名称,值指的是循环位置中的相应值。让我们用同一个两个数组来应用它,使其更清晰。

function echoR($item)
{
	var_dump($item);
}

$iterator->loopAll('echoR');

/* Returns:

array(2) {
  [1]=>
  int(1)
  [2]=>
  int(3)
}
array(2) {
  [1]=>
  int(3)
  [2]=>
  int(455)
}
array(2) {
  [1]=>
  int(5)
  [2]=>
  int(5)
} ... and so on...
*/ 

过滤迭代

还可以通过使用 filterValues() 方法在开始循环之前应用过滤器。这样做,迭代将不会发生对于过滤的值。该方法接受整数、字符串、浮点数或这些元素的数组。

function echoR($item)
{
  echo $item . PHP_EOL;
}

$iterator->filterValues('1', [1, '3', 11], 'echoR');
// Returns: 5 6 7 15 24 34 56 66 77 124

$iterator->filterKeys('1', [1, '3', 11], 'echoR');
// Returns: 1 5 7 11 15 24 34 56 66 124

正则表达式匹配

从 1.2.0 版本开始,存储的数组可以通过使用 regexMatch() 方法遍历匹配的元素,从给定的正则表达式表达式。

function echoR($item)
{
  echo $item . PHP_EOL;
}

$iterator->regexMatch('1', "/^[1-3]+[0-3]*$/", 'echoR');
// Returns: 1 3 11