Skip to content

Commit 164e6be

Browse files
committed
add ArraySort
1 parent 6975d31 commit 164e6be

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

src/ArraySort.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace Utilitte\Php;
4+
5+
final class ArraySort
6+
{
7+
8+
/**
9+
* @param mixed[] $sortBy
10+
* @param mixed[] $values
11+
* @return mixed[]
12+
*/
13+
public static function byGivenValues(array $sortBy, array $values, callable $idGetter): array
14+
{
15+
$valuesById = [];
16+
17+
foreach ($values as $value) {
18+
$valuesById[$idGetter($value)] = $value;
19+
}
20+
21+
$sorted = [];
22+
23+
foreach ($sortBy as $id) {
24+
if (isset($valuesById[$id])) {
25+
$sorted[] = $valuesById[$id];
26+
27+
unset($valuesById[$id]);
28+
}
29+
}
30+
31+
foreach ($valuesById as $value) {
32+
$sorted[] = $value;
33+
}
34+
35+
return $sorted;
36+
}
37+
38+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php declare(strict_types = 1);
2+
3+
use Tester\Assert;
4+
use Utilitte\Php\ArraySort;
5+
6+
require __DIR__ . '/../bootstrap.php';
7+
8+
Assert::same([
9+
['id' => 5],
10+
['id' => 1],
11+
['id' => 3],
12+
], ArraySort::byGivenValues(
13+
[5, 1, 3],
14+
[
15+
['id' => 1],
16+
['id' => 3],
17+
['id' => 5],
18+
],
19+
fn (array $value) => $value['id'],
20+
));

0 commit comments

Comments
 (0)