52 lines
1.2 KiB
PHP
52 lines
1.2 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
declare(strict_types=1);
|
||
|
|
|
||
|
|
namespace Jfcherng\Diff\Utility;
|
||
|
|
|
||
|
|
final class ReverseIterator
|
||
|
|
{
|
||
|
|
public const ITERATOR_GET_VALUE = 0;
|
||
|
|
public const ITERATOR_GET_KEY = 1 << 0;
|
||
|
|
public const ITERATOR_GET_BOTH = 1 << 1;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* The constructor.
|
||
|
|
*/
|
||
|
|
private function __construct()
|
||
|
|
{
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Iterate the array reversely.
|
||
|
|
*
|
||
|
|
* @param array $array the array
|
||
|
|
* @param int $flags the flags
|
||
|
|
*/
|
||
|
|
public static function fromArray(array $array, int $flags = self::ITERATOR_GET_VALUE): \Generator
|
||
|
|
{
|
||
|
|
// iterate [key => value] pair
|
||
|
|
if ($flags & self::ITERATOR_GET_BOTH) {
|
||
|
|
for (end($array); ($key = key($array)) !== null; prev($array)) {
|
||
|
|
yield $key => current($array);
|
||
|
|
}
|
||
|
|
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
// iterate only key
|
||
|
|
if ($flags & self::ITERATOR_GET_KEY) {
|
||
|
|
for (end($array); ($key = key($array)) !== null; prev($array)) {
|
||
|
|
yield $key;
|
||
|
|
}
|
||
|
|
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
// iterate only value
|
||
|
|
for (end($array); key($array) !== null; prev($array)) {
|
||
|
|
yield current($array);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|