Compare commits
3 Commits
Author | SHA1 | Date | |
---|---|---|---|
3fd75364a1 | |||
f247253f9e | |||
c623b435e9 |
@@ -292,4 +292,91 @@ trait ObjectArrayLINQTrait
|
|||||||
// Возвращаем результат
|
// Возвращаем результат
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возвращает первый элемент массива или значение по умолчанию.
|
||||||
|
*
|
||||||
|
* @param mixed|null $default Значение по умолчанию. По умолчанию, null.
|
||||||
|
*
|
||||||
|
* @return mixed|null Возвращает первый элемент массива или значение по умолчанию.
|
||||||
|
*/
|
||||||
|
public function First (mixed $default = null): mixed
|
||||||
|
{
|
||||||
|
// Получение первого элемента
|
||||||
|
$firstElement = reset($this->Container);
|
||||||
|
|
||||||
|
// Проверяем получение
|
||||||
|
if ($firstElement === false)
|
||||||
|
// - возвращаем значение по умолчанию
|
||||||
|
return $default;
|
||||||
|
|
||||||
|
// Возвращаем первый элемент
|
||||||
|
return $firstElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возвращает последний элемент массива или значение по умолчанию.
|
||||||
|
*
|
||||||
|
* @param mixed|null $default Значение по умолчанию. По умолчанию, null.
|
||||||
|
*
|
||||||
|
* @return mixed|null Возвращает последний элемент массива или значение по умолчанию.
|
||||||
|
*/
|
||||||
|
public function Last (mixed $default = null): mixed
|
||||||
|
{
|
||||||
|
// Получение последнего элемента
|
||||||
|
$lastElement = end($this->Container);
|
||||||
|
|
||||||
|
// Проверяем получение
|
||||||
|
if ($lastElement === false)
|
||||||
|
// - возвращаем значение по умолчанию
|
||||||
|
return $default;
|
||||||
|
|
||||||
|
// Возвращаем первый элемент
|
||||||
|
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));
|
||||||
|
}
|
||||||
}
|
}
|
@@ -312,4 +312,122 @@ class ObjectArrayTest extends TestCase
|
|||||||
$this->assertEquals('a', $sr->a);
|
$this->assertEquals('a', $sr->a);
|
||||||
$this->assertTrue($sr->c);
|
$this->assertTrue($sr->c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testFirst ()
|
||||||
|
{
|
||||||
|
$this->PrepareForTest();
|
||||||
|
|
||||||
|
$array = [
|
||||||
|
new A("a", 3, true),
|
||||||
|
new A("c", 2, false),
|
||||||
|
new A("b", 1, true),
|
||||||
|
];
|
||||||
|
|
||||||
|
$a_Array = new ObjectArray($array);
|
||||||
|
|
||||||
|
$sr = $a_Array->First();
|
||||||
|
|
||||||
|
$this->assertNotNull($sr);
|
||||||
|
$this->assertInstanceOf(A::class, $sr);
|
||||||
|
$this->assertEquals('a', $sr->a);
|
||||||
|
$this->assertTrue($sr->c);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testLast ()
|
||||||
|
{
|
||||||
|
$this->PrepareForTest();
|
||||||
|
|
||||||
|
$array = [
|
||||||
|
new A("a", 3, true),
|
||||||
|
new A("c", 2, false),
|
||||||
|
new A("b", 1, true),
|
||||||
|
];
|
||||||
|
|
||||||
|
$a_Array = new ObjectArray($array);
|
||||||
|
|
||||||
|
$sr = $a_Array->Last();
|
||||||
|
|
||||||
|
$this->assertNotNull($sr);
|
||||||
|
$this->assertInstanceOf(A::class, $sr);
|
||||||
|
$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);
|
||||||
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user