silverstripe-fulltextsearch/src/Utils/CombinationsArrayIterator.php

90 lines
1.9 KiB
PHP
Raw Normal View History

<?php
2017-04-21 02:27:01 +02:00
namespace SilverStripe\FullTextSearch\Utils;
2017-04-21 02:27:01 +02:00
use Iterator;
2015-11-21 07:19:20 +01:00
class CombinationsArrayIterator implements Iterator
{
protected $arrays;
protected $keys;
protected $numArrays;
2015-11-21 07:19:20 +01:00
protected $isValid = false;
protected $k = 0;
2015-11-21 07:19:20 +01:00
public function __construct($args)
{
$this->arrays = array();
$this->keys = array();
2022-04-13 01:24:03 +02:00
$keys = array_keys($args ?? []);
$values = array_values($args ?? []);
2015-11-21 07:19:20 +01:00
foreach ($values as $i => $arg) {
2022-04-13 01:24:03 +02:00
if (is_array($arg) && count($arg ?? [])) {
2015-11-21 07:19:20 +01:00
$this->arrays[] = $arg;
$this->keys[] = $keys[$i];
}
}
2022-04-13 01:24:03 +02:00
$this->numArrays = count($this->arrays ?? []);
2015-11-21 07:19:20 +01:00
$this->rewind();
}
2022-04-13 01:24:03 +02:00
#[\ReturnTypeWillChange]
2015-11-21 07:19:20 +01:00
public function rewind()
{
if (!$this->numArrays) {
$this->isValid = false;
} else {
$this->isValid = true;
$this->k = 0;
for ($i = 0; $i < $this->numArrays; $i++) {
reset($this->arrays[$i]);
}
}
}
2022-04-13 01:24:03 +02:00
#[\ReturnTypeWillChange]
2015-11-21 07:19:20 +01:00
public function valid()
{
return $this->isValid;
}
2022-04-13 01:24:03 +02:00
#[\ReturnTypeWillChange]
2015-11-21 07:19:20 +01:00
public function next()
{
$this->k++;
2015-11-21 07:19:20 +01:00
for ($i = 0; $i < $this->numArrays; $i++) {
if (next($this->arrays[$i]) === false) {
if ($i == $this->numArrays-1) {
$this->isValid = false;
} else {
reset($this->arrays[$i]);
}
} else {
break;
}
}
}
2022-04-13 01:24:03 +02:00
#[\ReturnTypeWillChange]
2015-11-21 07:19:20 +01:00
public function current()
{
$res = array();
for ($i = 0; $i < $this->numArrays; $i++) {
2022-04-13 01:24:03 +02:00
$res[$this->keys[$i]] = current($this->arrays[$i] ?? []);
2015-11-21 07:19:20 +01:00
}
return $res;
}
2022-04-13 01:24:03 +02:00
#[\ReturnTypeWillChange]
2015-11-21 07:19:20 +01:00
public function key()
{
return $this->k;
}
}