Completed
Pull Request — master (#14)
by Mischa ter
01:20
created
src/DamerauLevenshtein.php 2 patches
Indentation   +382 added lines, -382 removed lines patch added patch discarded remove patch
@@ -10,386 +10,386 @@
 block discarded – undo
10 10
 class DamerauLevenshtein
11 11
 {
12 12
 
13
-    /**
14
-     * First string.
15
-     *
16
-     * @var String
17
-     */
18
-    private $compOne;
19
-
20
-    /**
21
-     * Second string.
22
-     *
23
-     * @var String
24
-     */
25
-    private $compTwo;
26
-
27
-    /**
28
-     * Length of first string.
29
-     *
30
-     * @var int
31
-     */
32
-    private $compOneLength = 0;
33
-
34
-    /**
35
-     * Length of second string.
36
-     *
37
-     * @var int
38
-     */
39
-    private $compTwoLength = 0;
40
-
41
-    /**
42
-     * Matrix for Damerau Levenshtein distance dynamic programming computation.
43
-     *
44
-     * @var int[][]
45
-     */
46
-    private $matrix;
47
-
48
-    /**
49
-     * Boolean flag determining whether is matrix computed for input strings.
50
-     *
51
-     * @var bool
52
-     */
53
-    private $calculated = false;
54
-
55
-    /**
56
-     * Cost of character insertion (to first string to match second string).
57
-     *
58
-     * @var int
59
-     */
60
-    private $insCost = 1;
61
-
62
-    /**
63
-     * Cost of character deletion (from first string to match second string).
64
-     *
65
-     * @var int
66
-     */
67
-    private $delCost = 1;
68
-
69
-    /**
70
-     * Substitution cost.
71
-     *
72
-     * @var int
73
-     */
74
-    private $subCost = 1;
75
-
76
-    /**
77
-     * Transposition cost.
78
-     *
79
-     * @var int
80
-     */
81
-    private $transCost = 1;
82
-
83
-    /**
84
-     * Constructor.
85
-     *
86
-     * @param string $firstString first string to compute distance
87
-     * @param string $secondString second string to compute distance
88
-     * @param int $insCost Cost of character insertion
89
-     * @param int $delCost Cost of character deletion
90
-     * @param int $subCost Substitution cost
91
-     * @param int $transCost Transposition cost
92
-     */
93
-    public function __construct(
94
-        string $firstString,
95
-        string $secondString,
96
-        int $insCost = 1,
97
-        int $delCost = 1,
98
-        int $subCost = 1,
99
-        int $transCost = 1
100
-    ) {
101
-        if (!empty($firstString) || !empty($secondString)) {
102
-            $this->compOne = $firstString;
103
-            $this->compOneLength = (int)mb_strlen($this->compOne, 'UTF-8');
104
-            $this->compTwo = $secondString;
105
-            $this->compTwoLength = (int)mb_strlen($this->compTwo, 'UTF-8');
106
-        }
107
-
108
-        $this->insCost = $insCost;
109
-        $this->delCost = $delCost;
110
-        $this->subCost = $subCost;
111
-        $this->transCost = $transCost;
112
-    }
113
-
114
-    /**
115
-     * Returns computed matrix for given input strings.
116
-     *
117
-     * @return int[][] matrix
118
-     */
119
-    public function getMatrix(): array
120
-    {
121
-        if (!$this->calculated) {
122
-            $this->setupMatrix();
123
-        }
124
-
125
-        return $this->matrix;
126
-    }
127
-
128
-    /**
129
-     * Returns similarity of strings, absolute number = Damerau Levenshtein distance.
130
-     *
131
-     * @return int
132
-     */
133
-    public function getSimilarity(): int
134
-    {
135
-        if (!$this->calculated) {
136
-            $this->setupMatrix();
137
-        }
138
-
139
-        return $this->matrix[$this->compOneLength][$this->compTwoLength];
140
-    }
141
-
142
-    /**
143
-     * Procedure to compute matrix for given input strings.
144
-     *
145
-     * @return void
146
-     * @SuppressWarnings(PHPMD.CyclomaticComplexity)
147
-     */
148
-    private function setupMatrix(): void
149
-    {
150
-        $this->matrix = [[]];
151
-
152
-        $oneSize = $this->compOneLength;
153
-        $twoSize = $this->compTwoLength;
154
-
155
-        for ($i = 0; $i <= $oneSize; $i += 1) {
156
-            // @phan-suppress-next-line PhanTypeInvalidDimOffset
157
-            $this->matrix[$i][0] = $i > 0 ? $this->matrix[$i - 1][0] + $this->delCost : 0;
158
-        }
159
-
160
-        for ($i = 0; $i <= $twoSize; $i += 1) {
161
-            // Insertion actualy
162
-            $this->matrix[0][$i] = $i > 0 ? $this->matrix[0][$i - 1] + $this->insCost : 0;
163
-        }
164
-
165
-        for ($i = 1; $i <= $oneSize; $i += 1) {
166
-            // Curchar for the first string
167
-            $cOne = (string)mb_substr($this->compOne, $i - 1, 1, 'UTF-8');
168
-            for ($j = 1; $j <= $twoSize; $j += 1) {
169
-                // Curchar for the second string
170
-                $cTwo = (string)mb_substr($this->compTwo, $j - 1, 1, 'UTF-8');
171
-
172
-                // Compute substitution cost
173
-                if ($this->compare($cOne, $cTwo) === 0) {
174
-                    $cost = 0;
175
-                    $trans = 0;
176
-                } else {
177
-                    $cost = $this->subCost;
178
-                    $trans = $this->transCost;
179
-                }
180
-
181
-                // Deletion cost
182
-                // @phan-suppress-next-line PhanTypeInvalidDimOffset, PhanTypeInvalidLeftOperandOfAdd
183
-                $del = $this->matrix[$i - 1][$j] + $this->delCost;
184
-
185
-                // Insertion cost
186
-                // @phan-suppress-next-line PhanTypeArraySuspiciousNull, PhanTypeInvalidDimOffset, PhanTypeInvalidLeftOperandOfAdd
187
-                $ins = $this->matrix[$i][$j - 1] + $this->insCost;
188
-
189
-                // Substitution cost, 0 if same
190
-                $sub = $this->matrix[$i - 1][$j - 1] + $cost;
191
-
192
-                // Compute optimal
193
-                $this->matrix[$i][$j] = min($del, $ins, $sub);
194
-
195
-                // Transposition cost
196
-                if ($i > 1 && $j > 1) {
197
-                    // Last two
198
-                    // @phan-suppress-next-line PhanPartialTypeMismatchArgumentInternal
199
-                    $ccOne = mb_substr($this->compOne, $i - 2, 1, 'UTF-8');
200
-                    // @phan-suppress-next-line PhanPartialTypeMismatchArgumentInternal
201
-                    $ccTwo = mb_substr($this->compTwo, $j - 2, 1, 'UTF-8');
202
-
203
-                    if ($this->compare($cOne, $ccTwo) === 0 && $this->compare($ccOne, $cTwo) === 0) {
204
-                        // Transposition cost is computed as minimal of two
205
-                        $this->matrix[$i][$j] = min($this->matrix[$i][$j], $this->matrix[$i - 2][$j - 2] + $trans);
206
-                    }
207
-                }
208
-            }
209
-        }
210
-
211
-        $this->calculated = true;
212
-    }
213
-
214
-    /**
215
-     * Returns maximal possible edit Damerau Levenshtein distance between texts.
216
-     *
217
-     * On common substring of same length perform substitution / insert + delete
218
-     * (depends on what is cheaper), then on extra characters perform insertion / deletion
219
-     *
220
-     * @return int
221
-     */
222
-    public function getMaximalDistance(): int
223
-    {
224
-        $oneSize = $this->compOneLength;
225
-        $twoSize = $this->compTwoLength;
226
-
227
-        // Is substitution cheaper that delete + insert?
228
-        $subCost = min($this->subCost, $this->delCost + $this->insCost);
229
-
230
-        // Get common size
231
-        $minSize = min($oneSize, $twoSize);
232
-        $maxSize = max($oneSize, $twoSize);
233
-        $extraSize = $maxSize - $minSize;
234
-
235
-        // On common size perform substitution / delete + insert, what is cheaper
236
-        $maxCost = $subCost * $minSize;
237
-
238
-        // On resulting do insert/delete
239
-        if ($oneSize > $twoSize) {
240
-            // Delete extra characters
241
-            $maxCost += $extraSize * $this->delCost;
242
-        } else {
243
-            // Insert extra characters
244
-            $maxCost += $extraSize * $this->insCost;
245
-        }
246
-
247
-        return (int)$maxCost;
248
-    }
249
-
250
-    /**
251
-     * Returns relative distance of input strings (computed with maximal possible distance).
252
-     *
253
-     * @return float
254
-     */
255
-    public function getRelativeDistance(): float
256
-    {
257
-        if (!$this->calculated) {
258
-            $this->setupMatrix();
259
-        }
260
-
261
-        return (float)(1 - ($this->getSimilarity() / $this->getMaximalDistance()));
262
-    }
263
-
264
-    /**
265
-     * Compares two characters from string (this method may be overridden in child class).
266
-     *
267
-     * @param string $firstCharacter First character
268
-     * @param string $secondCharacter Second character
269
-     * @return int
270
-     */
271
-    protected function compare(string $firstCharacter, string $secondCharacter): int
272
-    {
273
-        return strcmp($firstCharacter, $secondCharacter);
274
-    }
275
-
276
-    /**
277
-     * Returns computed matrix for given input strings (For debugging purposes).
278
-     *
279
-     * @return string
280
-     */
281
-    public function displayMatrix(): string
282
-    {
283
-        if (!$this->calculated) {
284
-            $this->setupMatrix();
285
-        }
286
-
287
-        $oneSize = $this->compOneLength;
288
-        $twoSize = $this->compTwoLength;
289
-
290
-        $out = '  ' . $this->compOne . PHP_EOL;
291
-        for ($y = 0; $y <= $twoSize; $y += 1) {
292
-            if ($y - 1 < 0) {
293
-                $out .= ' ';
294
-            } else {
295
-                $out .= (string)mb_substr($this->compTwo, $y - 1, 1, 'UTF-8');
296
-            }
297
-
298
-            for ($x = 0; $x <= $oneSize; $x += 1) {
299
-                $out .= $this->matrix[$x][$y];
300
-            }
301
-
302
-            $out .= PHP_EOL;
303
-        }
304
-
305
-        return $out;
306
-    }
307
-
308
-    /**
309
-     * Returns current cost of insertion operation.
310
-     *
311
-     * @return int
312
-     */
313
-    public function getInsCost(): int
314
-    {
315
-        return $this->insCost;
316
-    }
317
-
318
-    /**
319
-     * Sets cost of insertion operation (insert characters to first string to match second string).
320
-     *
321
-     * @param int $insCost Cost of character insertion
322
-     * @return void
323
-     */
324
-    public function setInsCost(int $insCost): void
325
-    {
326
-        $this->calculated = $insCost === $this->insCost ? $this->calculated : false;
327
-        $this->insCost = $insCost;
328
-    }
329
-
330
-    /**
331
-     * Returns current cost of deletion operation.
332
-     *
333
-     * @return int
334
-     */
335
-    public function getDelCost(): int
336
-    {
337
-        return $this->delCost;
338
-    }
339
-
340
-    /**
341
-     * Sets cost of deletion operation (delete characters from first string to match second string).
342
-     *
343
-     * @param int $delCost Cost of character deletion
344
-     * @return void
345
-     */
346
-    public function setDelCost(int $delCost): void
347
-    {
348
-        $this->calculated = $delCost === $this->delCost ? $this->calculated : false;
349
-        $this->delCost = $delCost;
350
-    }
351
-
352
-    /**
353
-     * Returns current cost of substitution operation.
354
-     *
355
-     * @return int
356
-     */
357
-    public function getSubCost(): int
358
-    {
359
-        return $this->subCost;
360
-    }
361
-
362
-    /**
363
-     * Sets cost of substitution operation.
364
-     *
365
-     * @param int $subCost Cost of character substitution
366
-     * @return void
367
-     */
368
-    public function setSubCost(int $subCost): void
369
-    {
370
-        $this->calculated = $subCost === $this->subCost ? $this->calculated : false;
371
-        $this->subCost = $subCost;
372
-    }
373
-
374
-    /**
375
-     * Returns current cost of transposition operation.
376
-     *
377
-     * @return int
378
-     */
379
-    public function getTransCost(): int
380
-    {
381
-        return $this->transCost;
382
-    }
383
-
384
-    /**
385
-     * Sets cost of transposition operation.
386
-     *
387
-     * @param int $transCost Cost of character transposition
388
-     * @return void
389
-     */
390
-    public function setTransCost(int $transCost): void
391
-    {
392
-        $this->calculated = $transCost === $this->transCost ? $this->calculated : false;
393
-        $this->transCost = $transCost;
394
-    }
13
+	/**
14
+	 * First string.
15
+	 *
16
+	 * @var String
17
+	 */
18
+	private $compOne;
19
+
20
+	/**
21
+	 * Second string.
22
+	 *
23
+	 * @var String
24
+	 */
25
+	private $compTwo;
26
+
27
+	/**
28
+	 * Length of first string.
29
+	 *
30
+	 * @var int
31
+	 */
32
+	private $compOneLength = 0;
33
+
34
+	/**
35
+	 * Length of second string.
36
+	 *
37
+	 * @var int
38
+	 */
39
+	private $compTwoLength = 0;
40
+
41
+	/**
42
+	 * Matrix for Damerau Levenshtein distance dynamic programming computation.
43
+	 *
44
+	 * @var int[][]
45
+	 */
46
+	private $matrix;
47
+
48
+	/**
49
+	 * Boolean flag determining whether is matrix computed for input strings.
50
+	 *
51
+	 * @var bool
52
+	 */
53
+	private $calculated = false;
54
+
55
+	/**
56
+	 * Cost of character insertion (to first string to match second string).
57
+	 *
58
+	 * @var int
59
+	 */
60
+	private $insCost = 1;
61
+
62
+	/**
63
+	 * Cost of character deletion (from first string to match second string).
64
+	 *
65
+	 * @var int
66
+	 */
67
+	private $delCost = 1;
68
+
69
+	/**
70
+	 * Substitution cost.
71
+	 *
72
+	 * @var int
73
+	 */
74
+	private $subCost = 1;
75
+
76
+	/**
77
+	 * Transposition cost.
78
+	 *
79
+	 * @var int
80
+	 */
81
+	private $transCost = 1;
82
+
83
+	/**
84
+	 * Constructor.
85
+	 *
86
+	 * @param string $firstString first string to compute distance
87
+	 * @param string $secondString second string to compute distance
88
+	 * @param int $insCost Cost of character insertion
89
+	 * @param int $delCost Cost of character deletion
90
+	 * @param int $subCost Substitution cost
91
+	 * @param int $transCost Transposition cost
92
+	 */
93
+	public function __construct(
94
+		string $firstString,
95
+		string $secondString,
96
+		int $insCost = 1,
97
+		int $delCost = 1,
98
+		int $subCost = 1,
99
+		int $transCost = 1
100
+	) {
101
+		if (!empty($firstString) || !empty($secondString)) {
102
+			$this->compOne = $firstString;
103
+			$this->compOneLength = (int)mb_strlen($this->compOne, 'UTF-8');
104
+			$this->compTwo = $secondString;
105
+			$this->compTwoLength = (int)mb_strlen($this->compTwo, 'UTF-8');
106
+		}
107
+
108
+		$this->insCost = $insCost;
109
+		$this->delCost = $delCost;
110
+		$this->subCost = $subCost;
111
+		$this->transCost = $transCost;
112
+	}
113
+
114
+	/**
115
+	 * Returns computed matrix for given input strings.
116
+	 *
117
+	 * @return int[][] matrix
118
+	 */
119
+	public function getMatrix(): array
120
+	{
121
+		if (!$this->calculated) {
122
+			$this->setupMatrix();
123
+		}
124
+
125
+		return $this->matrix;
126
+	}
127
+
128
+	/**
129
+	 * Returns similarity of strings, absolute number = Damerau Levenshtein distance.
130
+	 *
131
+	 * @return int
132
+	 */
133
+	public function getSimilarity(): int
134
+	{
135
+		if (!$this->calculated) {
136
+			$this->setupMatrix();
137
+		}
138
+
139
+		return $this->matrix[$this->compOneLength][$this->compTwoLength];
140
+	}
141
+
142
+	/**
143
+	 * Procedure to compute matrix for given input strings.
144
+	 *
145
+	 * @return void
146
+	 * @SuppressWarnings(PHPMD.CyclomaticComplexity)
147
+	 */
148
+	private function setupMatrix(): void
149
+	{
150
+		$this->matrix = [[]];
151
+
152
+		$oneSize = $this->compOneLength;
153
+		$twoSize = $this->compTwoLength;
154
+
155
+		for ($i = 0; $i <= $oneSize; $i += 1) {
156
+			// @phan-suppress-next-line PhanTypeInvalidDimOffset
157
+			$this->matrix[$i][0] = $i > 0 ? $this->matrix[$i - 1][0] + $this->delCost : 0;
158
+		}
159
+
160
+		for ($i = 0; $i <= $twoSize; $i += 1) {
161
+			// Insertion actualy
162
+			$this->matrix[0][$i] = $i > 0 ? $this->matrix[0][$i - 1] + $this->insCost : 0;
163
+		}
164
+
165
+		for ($i = 1; $i <= $oneSize; $i += 1) {
166
+			// Curchar for the first string
167
+			$cOne = (string)mb_substr($this->compOne, $i - 1, 1, 'UTF-8');
168
+			for ($j = 1; $j <= $twoSize; $j += 1) {
169
+				// Curchar for the second string
170
+				$cTwo = (string)mb_substr($this->compTwo, $j - 1, 1, 'UTF-8');
171
+
172
+				// Compute substitution cost
173
+				if ($this->compare($cOne, $cTwo) === 0) {
174
+					$cost = 0;
175
+					$trans = 0;
176
+				} else {
177
+					$cost = $this->subCost;
178
+					$trans = $this->transCost;
179
+				}
180
+
181
+				// Deletion cost
182
+				// @phan-suppress-next-line PhanTypeInvalidDimOffset, PhanTypeInvalidLeftOperandOfAdd
183
+				$del = $this->matrix[$i - 1][$j] + $this->delCost;
184
+
185
+				// Insertion cost
186
+				// @phan-suppress-next-line PhanTypeArraySuspiciousNull, PhanTypeInvalidDimOffset, PhanTypeInvalidLeftOperandOfAdd
187
+				$ins = $this->matrix[$i][$j - 1] + $this->insCost;
188
+
189
+				// Substitution cost, 0 if same
190
+				$sub = $this->matrix[$i - 1][$j - 1] + $cost;
191
+
192
+				// Compute optimal
193
+				$this->matrix[$i][$j] = min($del, $ins, $sub);
194
+
195
+				// Transposition cost
196
+				if ($i > 1 && $j > 1) {
197
+					// Last two
198
+					// @phan-suppress-next-line PhanPartialTypeMismatchArgumentInternal
199
+					$ccOne = mb_substr($this->compOne, $i - 2, 1, 'UTF-8');
200
+					// @phan-suppress-next-line PhanPartialTypeMismatchArgumentInternal
201
+					$ccTwo = mb_substr($this->compTwo, $j - 2, 1, 'UTF-8');
202
+
203
+					if ($this->compare($cOne, $ccTwo) === 0 && $this->compare($ccOne, $cTwo) === 0) {
204
+						// Transposition cost is computed as minimal of two
205
+						$this->matrix[$i][$j] = min($this->matrix[$i][$j], $this->matrix[$i - 2][$j - 2] + $trans);
206
+					}
207
+				}
208
+			}
209
+		}
210
+
211
+		$this->calculated = true;
212
+	}
213
+
214
+	/**
215
+	 * Returns maximal possible edit Damerau Levenshtein distance between texts.
216
+	 *
217
+	 * On common substring of same length perform substitution / insert + delete
218
+	 * (depends on what is cheaper), then on extra characters perform insertion / deletion
219
+	 *
220
+	 * @return int
221
+	 */
222
+	public function getMaximalDistance(): int
223
+	{
224
+		$oneSize = $this->compOneLength;
225
+		$twoSize = $this->compTwoLength;
226
+
227
+		// Is substitution cheaper that delete + insert?
228
+		$subCost = min($this->subCost, $this->delCost + $this->insCost);
229
+
230
+		// Get common size
231
+		$minSize = min($oneSize, $twoSize);
232
+		$maxSize = max($oneSize, $twoSize);
233
+		$extraSize = $maxSize - $minSize;
234
+
235
+		// On common size perform substitution / delete + insert, what is cheaper
236
+		$maxCost = $subCost * $minSize;
237
+
238
+		// On resulting do insert/delete
239
+		if ($oneSize > $twoSize) {
240
+			// Delete extra characters
241
+			$maxCost += $extraSize * $this->delCost;
242
+		} else {
243
+			// Insert extra characters
244
+			$maxCost += $extraSize * $this->insCost;
245
+		}
246
+
247
+		return (int)$maxCost;
248
+	}
249
+
250
+	/**
251
+	 * Returns relative distance of input strings (computed with maximal possible distance).
252
+	 *
253
+	 * @return float
254
+	 */
255
+	public function getRelativeDistance(): float
256
+	{
257
+		if (!$this->calculated) {
258
+			$this->setupMatrix();
259
+		}
260
+
261
+		return (float)(1 - ($this->getSimilarity() / $this->getMaximalDistance()));
262
+	}
263
+
264
+	/**
265
+	 * Compares two characters from string (this method may be overridden in child class).
266
+	 *
267
+	 * @param string $firstCharacter First character
268
+	 * @param string $secondCharacter Second character
269
+	 * @return int
270
+	 */
271
+	protected function compare(string $firstCharacter, string $secondCharacter): int
272
+	{
273
+		return strcmp($firstCharacter, $secondCharacter);
274
+	}
275
+
276
+	/**
277
+	 * Returns computed matrix for given input strings (For debugging purposes).
278
+	 *
279
+	 * @return string
280
+	 */
281
+	public function displayMatrix(): string
282
+	{
283
+		if (!$this->calculated) {
284
+			$this->setupMatrix();
285
+		}
286
+
287
+		$oneSize = $this->compOneLength;
288
+		$twoSize = $this->compTwoLength;
289
+
290
+		$out = '  ' . $this->compOne . PHP_EOL;
291
+		for ($y = 0; $y <= $twoSize; $y += 1) {
292
+			if ($y - 1 < 0) {
293
+				$out .= ' ';
294
+			} else {
295
+				$out .= (string)mb_substr($this->compTwo, $y - 1, 1, 'UTF-8');
296
+			}
297
+
298
+			for ($x = 0; $x <= $oneSize; $x += 1) {
299
+				$out .= $this->matrix[$x][$y];
300
+			}
301
+
302
+			$out .= PHP_EOL;
303
+		}
304
+
305
+		return $out;
306
+	}
307
+
308
+	/**
309
+	 * Returns current cost of insertion operation.
310
+	 *
311
+	 * @return int
312
+	 */
313
+	public function getInsCost(): int
314
+	{
315
+		return $this->insCost;
316
+	}
317
+
318
+	/**
319
+	 * Sets cost of insertion operation (insert characters to first string to match second string).
320
+	 *
321
+	 * @param int $insCost Cost of character insertion
322
+	 * @return void
323
+	 */
324
+	public function setInsCost(int $insCost): void
325
+	{
326
+		$this->calculated = $insCost === $this->insCost ? $this->calculated : false;
327
+		$this->insCost = $insCost;
328
+	}
329
+
330
+	/**
331
+	 * Returns current cost of deletion operation.
332
+	 *
333
+	 * @return int
334
+	 */
335
+	public function getDelCost(): int
336
+	{
337
+		return $this->delCost;
338
+	}
339
+
340
+	/**
341
+	 * Sets cost of deletion operation (delete characters from first string to match second string).
342
+	 *
343
+	 * @param int $delCost Cost of character deletion
344
+	 * @return void
345
+	 */
346
+	public function setDelCost(int $delCost): void
347
+	{
348
+		$this->calculated = $delCost === $this->delCost ? $this->calculated : false;
349
+		$this->delCost = $delCost;
350
+	}
351
+
352
+	/**
353
+	 * Returns current cost of substitution operation.
354
+	 *
355
+	 * @return int
356
+	 */
357
+	public function getSubCost(): int
358
+	{
359
+		return $this->subCost;
360
+	}
361
+
362
+	/**
363
+	 * Sets cost of substitution operation.
364
+	 *
365
+	 * @param int $subCost Cost of character substitution
366
+	 * @return void
367
+	 */
368
+	public function setSubCost(int $subCost): void
369
+	{
370
+		$this->calculated = $subCost === $this->subCost ? $this->calculated : false;
371
+		$this->subCost = $subCost;
372
+	}
373
+
374
+	/**
375
+	 * Returns current cost of transposition operation.
376
+	 *
377
+	 * @return int
378
+	 */
379
+	public function getTransCost(): int
380
+	{
381
+		return $this->transCost;
382
+	}
383
+
384
+	/**
385
+	 * Sets cost of transposition operation.
386
+	 *
387
+	 * @param int $transCost Cost of character transposition
388
+	 * @return void
389
+	 */
390
+	public function setTransCost(int $transCost): void
391
+	{
392
+		$this->calculated = $transCost === $this->transCost ? $this->calculated : false;
393
+		$this->transCost = $transCost;
394
+	}
395 395
 }
Please login to merge, or discard this patch.
Spacing   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -100,9 +100,9 @@  discard block
 block discarded – undo
100 100
     ) {
101 101
         if (!empty($firstString) || !empty($secondString)) {
102 102
             $this->compOne = $firstString;
103
-            $this->compOneLength = (int)mb_strlen($this->compOne, 'UTF-8');
103
+            $this->compOneLength = (int) mb_strlen($this->compOne, 'UTF-8');
104 104
             $this->compTwo = $secondString;
105
-            $this->compTwoLength = (int)mb_strlen($this->compTwo, 'UTF-8');
105
+            $this->compTwoLength = (int) mb_strlen($this->compTwo, 'UTF-8');
106 106
         }
107 107
 
108 108
         $this->insCost = $insCost;
@@ -164,10 +164,10 @@  discard block
 block discarded – undo
164 164
 
165 165
         for ($i = 1; $i <= $oneSize; $i += 1) {
166 166
             // Curchar for the first string
167
-            $cOne = (string)mb_substr($this->compOne, $i - 1, 1, 'UTF-8');
167
+            $cOne = (string) mb_substr($this->compOne, $i - 1, 1, 'UTF-8');
168 168
             for ($j = 1; $j <= $twoSize; $j += 1) {
169 169
                 // Curchar for the second string
170
-                $cTwo = (string)mb_substr($this->compTwo, $j - 1, 1, 'UTF-8');
170
+                $cTwo = (string) mb_substr($this->compTwo, $j - 1, 1, 'UTF-8');
171 171
 
172 172
                 // Compute substitution cost
173 173
                 if ($this->compare($cOne, $cTwo) === 0) {
@@ -244,7 +244,7 @@  discard block
 block discarded – undo
244 244
             $maxCost += $extraSize * $this->insCost;
245 245
         }
246 246
 
247
-        return (int)$maxCost;
247
+        return (int) $maxCost;
248 248
     }
249 249
 
250 250
     /**
@@ -258,7 +258,7 @@  discard block
 block discarded – undo
258 258
             $this->setupMatrix();
259 259
         }
260 260
 
261
-        return (float)(1 - ($this->getSimilarity() / $this->getMaximalDistance()));
261
+        return (float) (1 - ($this->getSimilarity() / $this->getMaximalDistance()));
262 262
     }
263 263
 
264 264
     /**
@@ -287,12 +287,12 @@  discard block
 block discarded – undo
287 287
         $oneSize = $this->compOneLength;
288 288
         $twoSize = $this->compTwoLength;
289 289
 
290
-        $out = '  ' . $this->compOne . PHP_EOL;
290
+        $out = '  '.$this->compOne.PHP_EOL;
291 291
         for ($y = 0; $y <= $twoSize; $y += 1) {
292 292
             if ($y - 1 < 0) {
293 293
                 $out .= ' ';
294 294
             } else {
295
-                $out .= (string)mb_substr($this->compTwo, $y - 1, 1, 'UTF-8');
295
+                $out .= (string) mb_substr($this->compTwo, $y - 1, 1, 'UTF-8');
296 296
             }
297 297
 
298 298
             for ($x = 0; $x <= $oneSize; $x += 1) {
Please login to merge, or discard this patch.