diff --git a/sources/traits/ObjectArray/ObjectArrayLINQTrait.php b/sources/traits/ObjectArray/ObjectArrayLINQTrait.php index 450303b..85c2d19 100644 --- a/sources/traits/ObjectArray/ObjectArrayLINQTrait.php +++ b/sources/traits/ObjectArray/ObjectArrayLINQTrait.php @@ -334,4 +334,49 @@ trait ObjectArrayLINQTrait // Возвращаем первый элемент return $lastElement; } + + /** + * Пропускает первые $count элементов массива. Возвращает новый массив. + * + * ВНИМАНИЕ: рекомендуется использовать ТОЛЬКО на отсортированных массивах. + * + * @param int $count Количество элементов, которые необходимо обрезать с начала массива. + * + * @return ObjectArray Возвращает новый массив, состоящий из элементов, начиная с $count + 1 элемента. + */ + public function Skip (int $count): ObjectArray + { + return new ObjectArray(array_slice($this->Container, $count)); + } + + /** + * Получает первые $count элементов массива. Возвращает новый массив. + * + * ВНИМАНИЕ: рекомендуется использовать ТОЛЬКО на отсортированных массивах. + * + * @param int $count Количество элементов, которые необходимо получить с начала массива. + * + * @return ObjectArray Возвращает новый массив, состоящий из первых $count элементов старого массива. + */ + public function Take (int $count): ObjectArray + { + return new ObjectArray(array_slice($this->Container, 0, $count)); + } + + /** + * Совмещает в себе две функции, которые одновременно применяет к массиву: Skip ($startFrom) и Take ($count). + * Возвращает новый массив. + * + * ВНИМАНИЕ: рекомендуется использовать ТОЛЬКО на отсортированных массивах. + * + * @param int $startFrom Начальный индекс массива, с которого нужно получить. + * @param int $count Количество элементов, которые необходимо получить. + * + * @return ObjectArray Возвращает новый массив, состоящий из $count элементов старого массива, начиная с индекса + * $startFrom. + */ + public function SkipAndTake (int $startFrom, int $count): ObjectArray + { + return new ObjectArray(array_slice($this->Container, $startFrom, $count)); + } } \ No newline at end of file diff --git a/tests/classes/ObjectArrayTest.php b/tests/classes/ObjectArrayTest.php index a5763ea..20eb353 100644 --- a/tests/classes/ObjectArrayTest.php +++ b/tests/classes/ObjectArrayTest.php @@ -352,4 +352,82 @@ class ObjectArrayTest extends TestCase $this->assertEquals('b', $sr->a); $this->assertTrue($sr->c); } + + public function testSkip () + { + $this->PrepareForTest(); + + $array = [ + new A("a", 3, true), + new A("c", 2, false), + new A("b", 1, true), + new A("d", 5, true), + new A("e", 4, true), + new A("f", 6, false) + ]; + + $a_Array = new ObjectArray($array); + + // Для начала отсортируем по b + $a_Array->Sort("b"); + + $b_Array = $a_Array->Skip(2); + + $this->assertNotNull($b_Array); + $this->assertEquals(4, $b_Array->Count()); + $this->assertEquals(3, $b_Array->First()->b); + $this->assertEquals(6, $b_Array->Last()->b); + } + + public function testTake () + { + $this->PrepareForTest(); + + $array = [ + new A("a", 3, true), + new A("c", 2, false), + new A("b", 1, true), + new A("d", 5, true), + new A("e", 4, true), + new A("f", 6, false) + ]; + + $a_Array = new ObjectArray($array); + + // Для начала отсортируем по b + $a_Array->Sort("b"); + + $b_Array = $a_Array->Take(3); + + $this->assertNotNull($b_Array); + $this->assertEquals(3, $b_Array->Count()); + $this->assertEquals(1, $b_Array->First()->b); + $this->assertEquals(3, $b_Array->Last()->b); + } + + public function testSkipAndTake () + { + $this->PrepareForTest(); + + $array = [ + new A("a", 3, true), + new A("c", 2, false), + new A("b", 1, true), + new A("d", 5, true), + new A("e", 4, true), + new A("f", 6, false) + ]; + + $a_Array = new ObjectArray($array); + + // Для начала отсортируем по b + $a_Array->Sort("b"); + + $b_Array = $a_Array->SkipAndTake(2, 3); + + $this->assertNotNull($b_Array); + $this->assertEquals(3, $b_Array->Count()); + $this->assertEquals(3, $b_Array->First()->b); + $this->assertEquals(5, $b_Array->Last()->b); + } } \ No newline at end of file