Skip to content

Commit

Permalink
Merge pull request #17 from citrus-framework/add_first
Browse files Browse the repository at this point in the history
first,lastメソッドの追加
  • Loading branch information
take64 authored Jun 29, 2024
2 parents 32bd224 + 89de4d7 commit 8899daa
Show file tree
Hide file tree
Showing 5 changed files with 118 additions and 29 deletions.
41 changes: 27 additions & 14 deletions src/Collection.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

namespace Citrus;

use Citrus\Collection\Fetcher;
use Citrus\Collection\Filter;
use Citrus\Collection\Generator;
use Citrus\Collection\JudgeMentor;
Expand All @@ -36,6 +37,32 @@ public function __construct(array $source)
$this->source = $source;
}

/**************************************************************************
* Fetcher
**************************************************************************/

/**
* 先頭の要素を取得
*
* @param callable|null $callable
* @return mixed
*/
public function first(callable|null $callable = null): mixed
{
return Fetcher::first($this->source, $callable);
}

/**
* 最後の要素を取得
*
* @param callable|null $callable
* @return mixed
*/
public function last(callable|null $callable = null): mixed
{
return Fetcher::last($this->source, $callable);
}

/**************************************************************************
* Filter
**************************************************************************/
Expand Down Expand Up @@ -389,18 +416,4 @@ public function toKeys(): array
{
return array_keys($this->source);
}

/**
* 一件取得
*
* @return mixed|null
*/
public function one(): mixed
{
foreach ($this->source as $one)
{
return $one;
}
return null;
}
}
55 changes: 55 additions & 0 deletions src/Collection/Fetcher.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<?php

declare(strict_types=1);

/**
* @copyright Copyright 2020, CitrusCollection. All Rights Reserved.
* @author take64 <take64@citrus.tk>
* @license http://www.citrus.tk/
*/

namespace Citrus\Collection;

/**
* コレクションメソッド(取得系)
*/
class Fetcher
{
/**
* 先頭の要素を取得
*
* @param array $source
* @param callable|null $callable function($value, $key)
* @return mixed
*/
public static function first(array $source, callable|null $callable = null): mixed
{
$filtered = Filter::filter($source, $callable);
$count = Measurer::count($filtered);
// 無ければnull
if ($count === 0)
{
return null;
}
return array_values($filtered)[0];
}

/**
* 最後の要素を取得
*
* @param array $source
* @param callable|null $callable function($value, $key)
* @return mixed
*/
public static function last(array $source, callable|null $callable = null): mixed
{
$filtered = Filter::filter($source, $callable);
$count = Measurer::count($filtered);
// 無ければnull
if ($count === 0)
{
return null;
}
return array_values($filtered)[$count - 1];
}
}
12 changes: 9 additions & 3 deletions src/Collection/Filter.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,18 @@ class Filter
/**
* callable関数の返却値がtrueの場合に積んで返却する
*
* @param array $source
* @param callable $callable function($value, $key)
* @param array $source
* @param callable|null $callable function($value, $key)
* @return array
*/
public static function filter(array $source, callable $callable): array
public static function filter(array $source, callable|null $callable = null): array
{
// 無ければそのまま返す
if (is_null($callable))
{
return $source;
}

$results = [];
foreach ($source as $ky => $vl)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Collection/Measurer.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class Measurer
* @param callable|null $callable function($value, $key)
* @return int
*/
public static function count(array $source, callable|null $callable): int
public static function count(array $source, callable|null $callable = null): int
{
if (!is_null($callable))
{
Expand Down
37 changes: 26 additions & 11 deletions tests/CollectionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -549,17 +549,6 @@ public function sortByProps_ソートした配列を生成して返却()
])->toList());
}

/**
* @test
*/
public function one_一件だけ取得()
{
// 降順にソート
$expected = ['name' => 'a', 'age' => 16];
// 検算
$this->assertSame($expected, Collection::stream($this->values)->one());
}

/**
* @test
*/
Expand Down Expand Up @@ -606,6 +595,32 @@ public function isNotEmpty_要素が空ではない()
return $value['age'] > 19;
}));
}

/**
* @test
*/
public function first_先頭一件取得()
{
// 検算
$this->assertSame($this->values[0], Collection::stream($this->values)->first());
// 検算:フィルター
$this->assertSame($this->values[1], Collection::stream($this->values)->first(function ($value, $key) {
return $value['age'] === 11 or $value['age'] === 13;
}));
}

/**
* @test
*/
public function last_最後一件取得()
{
// 検算
$this->assertSame($this->values[count($this->values) - 1], Collection::stream($this->values)->last());
// 検算:フィルター
$this->assertSame($this->values[2], Collection::stream($this->values)->last(function ($value, $key) {
return $value['age'] === 11 or $value['age'] === 13;
}));
}
}

class CollectionObj
Expand Down

0 comments on commit 8899daa

Please sign in to comment.