-
Notifications
You must be signed in to change notification settings - Fork 0
/
RandomCharacter.php
79 lines (69 loc) · 1.7 KB
/
RandomCharacter.php
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
<?php
namespace GregorJ\CorrectHorse\Generators;
use GregorJ\CorrectHorse\RandomGeneratorInterface;
use function array_diff;
use function array_rand;
use function in_array;
use function substr;
/**
* Class RandomCharacter
*/
final class RandomCharacter implements RandomGeneratorInterface
{
use ManageRandomItemsTrait;
/**
* Define a list of default characters in case none are provided.
*/
public const DEFAULT_CHARS = ['-', '#', '.', ',', '+', ';', '*'];
/**
* @var string[]
*/
private $chars = [];
/**
* Initialize the class with an array of special characters.
* @param array $chars
*/
public function __construct(array $chars = [])
{
if ($chars !== []) {
foreach ($chars as $char) {
$this->addChar($char);
}
}
if ($this->chars === []) {
$this->chars = self::DEFAULT_CHARS;
}
}
/**
* Add a special character to the list of special characters.
* @param string $char
* @return void
*/
public function addChar(string $char): void
{
$char = substr($char, 0, 1);
if (!$this->hasChar($char) && $char !== '') {
$this->chars[] = $char;
}
}
/**
* @param string $char
* @return bool
*/
public function hasChar(string $char): bool
{
return in_array($char, $this->chars);
}
/**
* Add a randomly generated item.
* @return void
*/
public function add(): void
{
$chars = array_diff($this->chars, $this->items);
if ($chars === []) {
return;
}
$this->items[] = $chars[array_rand($chars)];
}
}