1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
<?php
use PHPUnit\Framework\TestCase;
class ArrayUtilTest extends TestCase
{
public function testFlattenByKeyBasicAndMissingKeys(): void
{
$in = [
['id' => 1, 'name' => 'a'],
['id' => 2, 'name' => 'b', 'x' => 5],
['name' => 'c'], // missing 'id' -> skipped by array_column()
];
$this->assertSame([1, 2], ArrayUtil::flattenByKey($in, 'id'));
}
public function testMergeByKeyMergesAcrossSubArrays(): void
{
$in = [
'a' => ['k1' => 1, 'k2' => 2],
'b' => ['k1' => 3],
];
$expected = [
'k1' => ['a' => 1, 'b' => 3],
'k2' => ['a' => 2, 'b' => false],
];
$this->assertSame($expected, ArrayUtil::mergeByKey($in));
}
public function testSortByColumnAscendingAndDescending(): void
{
$rows = [
['n' => 'b', 'v' => 2],
['n' => 'a', 'v' => 3],
['n' => 'c', 'v' => 1],
];
$copy = $rows;
ArrayUtil::sortByColumn($rows, 'v', SORT_ASC);
$this->assertSame([
['n' => 'c', 'v' => 1],
['n' => 'b', 'v' => 2],
['n' => 'a', 'v' => 3],
], $rows);
ArrayUtil::sortByColumn($copy, 'n', SORT_DESC, SORT_STRING);
$this->assertSame([
['n' => 'c', 'v' => 1],
['n' => 'b', 'v' => 2],
['n' => 'a', 'v' => 3],
], $copy);
}
public function testHasAllKeys(): void
{
$arr = ['a' => 1, 'b' => 2];
$this->assertTrue(ArrayUtil::hasAllKeys($arr, ['a', 'b']));
$this->assertFalse(ArrayUtil::hasAllKeys($arr, ['a', 'c']));
$this->assertTrue(ArrayUtil::hasAllKeys($arr, []));
}
public function testIsOnlyPrimitiveTypes(): void
{
$this->assertTrue(ArrayUtil::isOnlyPrimitiveTypes([1, 'x', 1.2, null, true, false, 0]));
$this->assertFalse(ArrayUtil::isOnlyPrimitiveTypes([[]]));
$this->assertFalse(ArrayUtil::isOnlyPrimitiveTypes([new stdClass()]));
$h = fopen('php://memory', 'r');
try {
$this->assertFalse(ArrayUtil::isOnlyPrimitiveTypes([$h]));
} finally {
if (is_resource($h))
fclose($h);
}
}
public function testForceTypeMutatesArrayInPlace(): void
{
$arr = ['1', '2', '3'];
ArrayUtil::forceType($arr, 'int');
$this->assertSame([1, 2, 3], $arr);
$arr = ['0', '1', '', 'foo'];
ArrayUtil::forceType($arr, 'bool');
// In PHP, (bool) '0' is false; non-empty strings except '0' are true; empty string is false
$this->assertSame([false, true, false, true], $arr);
$arr = [1, 2, 3];
ArrayUtil::forceType($arr, 'string');
$this->assertSame(['1', '2', '3'], $arr);
}
}
|