Skip to content

Commit 65a5b0e

Browse files
committed
Added new mode for array map method and 4 new utility methods:
- Get first key - Get last key - Get first value - Get last value
1 parent 04e7c2e commit 65a5b0e

File tree

2 files changed

+191
-0
lines changed

2 files changed

+191
-0
lines changed

src/Arr.php

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,22 @@ class Arr
2828
const FORCE_ARRAY_PRESERVE_OBJECTS = 4;
2929
const FORCE_ARRAY_PRESERVE_ARRAY_OBJECTS = 8;
3030

31+
/**
32+
* Map array using callback in form of function($key, $value)
33+
*/
3134
const MAP_ARRAY_KEY_VALUE = 1;
35+
/**
36+
* Map array using callback in form of function($value, $key1, $key2, ...)
37+
*/
3238
const MAP_ARRAY_VALUE_KEYS_LIST = 2;
39+
/**
40+
* Map array using callback in form of function(array $keys, $value)
41+
*/
3342
const MAP_ARRAY_KEYS_ARRAY_VALUE = 4;
43+
/**
44+
* Map array using callback in form of function($value, $key)
45+
*/
46+
const MAP_ARRAY_VALUE_KEY = 8;
3447

3548
const UNPACK_ALL = 1;
3649
/**
@@ -488,6 +501,7 @@ public static function isArrayOfArrays(array $array): bool
488501
* MAP_ARRAY_KEY_VALUE -> callback($key, $value)<br>
489502
* MAP_ARRAY_VALUE_KEYS_LIST -> callback($value, $key1, $key2, ...)<br>
490503
* MAP_ARRAY_KEYS_ARRAY_VALUE -> callback(array $keys, $value)
504+
* MAP_ARRAY_VALUE_KEY -> callback($value, $key)
491505
* @return array
492506
*/
493507
public static function map($array, $callback, int $mode = self::MAP_ARRAY_KEY_VALUE): array
@@ -507,6 +521,11 @@ public static function map($array, $callback, int $mode = self::MAP_ARRAY_KEY_VA
507521
$result[$key] = $callback($key, $value);
508522
}
509523
break;
524+
case self::MAP_ARRAY_VALUE_KEY:
525+
foreach ($array as $key => $value) {
526+
$result[$key] = $callback($value, $key);
527+
}
528+
break;
510529
case self::MAP_ARRAY_VALUE_KEYS_LIST:
511530
foreach (self::unpack($array) as $dotKeys => $value) {
512531
$keys = self::getKeysArray($dotKeys);
@@ -1064,5 +1083,62 @@ public static function odd(array $array): array
10641083
return self::nth($array, 2, 1);
10651084
}
10661085

1086+
/**
1087+
* Get the first key of the given array without affecting the internal array pointer.
1088+
*
1089+
* @param array $array
1090+
* @return string|int|null Null if array is empty
1091+
*/
1092+
public static function getFirstKey(array $array)
1093+
{
1094+
return empty($array) ? null : array_keys($array)[0];
1095+
}
1096+
1097+
/**
1098+
* Get the last key of the given array without affecting the internal array pointer.
1099+
*
1100+
* @param array $array
1101+
* @return string|int|null Null if array is empty
1102+
*/
1103+
public static function getLastKey(array $array)
1104+
{
1105+
if (empty($array)) {
1106+
return null;
1107+
} else {
1108+
$keys = array_keys($array);
1109+
return $keys[count($keys) - 1];
1110+
}
1111+
}
1112+
1113+
/**
1114+
* Get the first value of the given array without affecting the internal array pointer.
1115+
*
1116+
* @param array $array
1117+
* @return mixed|null Null if array is empty
1118+
*/
1119+
public static function getFirstValue(array $array)
1120+
{
1121+
if (empty($array)) {
1122+
return null;
1123+
}
10671124

1125+
return array_values($array)[0];
1126+
}
1127+
1128+
/**
1129+
* Get the last value of the given array without affecting the internal array pointer.
1130+
*
1131+
* @param array $array
1132+
* @return mixed|null Null if array is empty
1133+
*/
1134+
public static function getLastValue(array $array)
1135+
{
1136+
if (empty($array)) {
1137+
return null;
1138+
}
1139+
1140+
$values = array_values($array);
1141+
1142+
return $values[count($values) - 1];
1143+
}
10681144
}

test/ArrTest.php

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,68 @@ function __call($func, $params)
2424
};
2525
}
2626

27+
public function arrayProvider(): array
28+
{
29+
return [
30+
[[3]],
31+
[['key']],
32+
[[1, 'test']],
33+
[['key1' => 1, 'key2' => 2, 'key3' => 3]],
34+
[[[[]]]],
35+
[[0, '', null, false]],
36+
[[1, true, 'true', 'false', '0', ' 1', PHP_INT_MIN, PHP_INT_MAX]],
37+
[[
38+
'test' => [
39+
'test1',
40+
'test2' => [
41+
'test3' => 'abc',
42+
'test4'
43+
],
44+
[
45+
'test6' => 'def'
46+
],
47+
],
48+
]],
49+
['a' => [
50+
'b' => [
51+
1 => [
52+
PHP_INT_MIN,
53+
2 => 3
54+
],
55+
'c' => [
56+
4,
57+
true,
58+
],
59+
5
60+
],
61+
'd' => [
62+
'e',
63+
[
64+
'f' => 6
65+
]
66+
],
67+
],
68+
'g' => [
69+
'h',
70+
'i',
71+
PHP_INT_MAX,
72+
'j' => [
73+
7,
74+
2 => 8,
75+
null,
76+
]
77+
],
78+
[
79+
'k',
80+
'l' => [
81+
9,
82+
10,
83+
false,
84+
],
85+
]]
86+
];
87+
}
88+
2789
/********************************* Common *********************************/
2890
public function testGetKeysArray()
2991
{
@@ -515,6 +577,9 @@ public function testMap()
515577
$funcKeyVal = function ($key, $value) {
516578
return "{$key}{$value}";
517579
};
580+
$funcValKey = function ($value, $key) {
581+
return "{$key}{$value}";
582+
};
518583
$funcKeysVal = function ($keys, $value) {
519584
return implode($keys, '-') . ':' . $value;
520585
};
@@ -575,8 +640,12 @@ public function testMap()
575640
/** @noinspection PhpParamsInspection */
576641
$this->assertSame(['0a', '1b', '2c'], Arr::map($funcKeyVal, $array));
577642
/** @noinspection PhpParamsInspection */
643+
$this->assertSame(['0a', '1b', '2c'], Arr::map($funcValKey, $array));
644+
/** @noinspection PhpParamsInspection */
578645
$this->assertSame([], Arr::map($funcKeyVal, []));
579646
/** @noinspection PhpParamsInspection */
647+
$this->assertSame([], Arr::map($funcValKey, []));
648+
/** @noinspection PhpParamsInspection */
580649
$this->assertSame(range(0, 2), Arr::map(function ($key) {
581650
return $key;
582651
}, $array));
@@ -1304,6 +1373,52 @@ public function testShuffle()
13041373
$this->assertTrue(Arr::hasKeys(Arr::shuffle($array), array_keys($array), true));
13051374
$this->assertSame([], array_diff(Arr::shuffle($array), $array));
13061375
}
1376+
1377+
/**
1378+
* @param array $array
1379+
*
1380+
* @dataProvider arrayProvider
1381+
*/
1382+
public function testGetFirstKey(array $array)
1383+
{
1384+
$this->assertSame(null, Arr::getFirstKey([]));
1385+
reset($array);
1386+
$this->assertSame(key($array), Arr::getFirstKey($array));
1387+
}
1388+
1389+
/**
1390+
* @param array $array
1391+
*
1392+
* @dataProvider arrayProvider
1393+
*/
1394+
public function testGetLastKey(array $array)
1395+
{
1396+
$this->assertSame(null, Arr::getLastKey([]));
1397+
end($array);
1398+
$this->assertSame(key($array), Arr::getLastKey($array));
1399+
}
1400+
1401+
/**
1402+
* @param array $array
1403+
*
1404+
* @dataProvider arrayProvider
1405+
*/
1406+
public function testGetFirstValue(array $array)
1407+
{
1408+
$this->assertSame(null, Arr::getFirstValue([]));
1409+
$this->assertSame(reset($array), Arr::getFirstValue($array));
1410+
}
1411+
1412+
/**
1413+
* @param array $array
1414+
*
1415+
* @dataProvider arrayProvider
1416+
*/
1417+
public function testGetLastValue(array $array)
1418+
{
1419+
$this->assertSame(null, Arr::getLastValue([]));
1420+
$this->assertSame(end($array), Arr::getLastValue($array));
1421+
}
13071422
}
13081423

13091424
class TestCheckMethod

0 commit comments

Comments
 (0)