+ [ObjectArray]: Добавлена функция Skip для пропуска $offset элементов массива.
+ [ObjectArray]: Добавлена функция Take для получения $count элементов массива.
+ [ObjectArray]: Добавлена функция SkipAndTake для получения $count элементов массива, начиная с индекса $startFrom.
This commit is contained in:
Александр Бабаев 2025-02-08 17:57:09 +03:00
parent f247253f9e
commit 3fd75364a1
2 changed files with 123 additions and 0 deletions

View File

@ -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));
}
}

View File

@ -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);
}
}