Completed
Push — master ( ea568a...e269ab )
by Pol
07:52
created

AbstractNGrams::doNgrams()   A

Complexity

Conditions 4
Paths 8

Size

Total Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 4

Importance

Changes 0
Metric Value
dl 0
loc 14
ccs 9
cts 9
cp 1
rs 9.7998
c 0
b 0
f 0
nc 8
cc 4
nop 3
crap 4
1
<?php
2
3
declare(strict_types = 1);
4
5
namespace drupol\phpngrams;
6
7
use drupol\phpermutations\Iterators\NGrams;
0 ignored issues
show
Bug introduced by
This use statement conflicts with another class in this namespace, drupol\phpngrams\NGrams.

Let’s assume that you have a directory layout like this:

.
|-- OtherDir
|   |-- Bar.php
|   `-- Foo.php
`-- SomeDir
    `-- Foo.php

and let’s assume the following content of Bar.php:

// Bar.php
namespace OtherDir;

use SomeDir\Foo; // This now conflicts the class OtherDir\Foo

If both files OtherDir/Foo.php and SomeDir/Foo.php are loaded in the same runtime, you will see a PHP error such as the following:

PHP Fatal error:  Cannot use SomeDir\Foo as Foo because the name is already in use in OtherDir/Foo.php

However, as OtherDir/Foo.php does not necessarily have to be loaded and the error is only triggered if it is loaded before OtherDir/Bar.php, this problem might go unnoticed for a while. In order to prevent this error from surfacing, you must import the namespace with a different alias:

// Bar.php
namespace OtherDir;

use SomeDir\Foo as SomeDirFoo; // There is no conflict anymore.
Loading history...
8
9
/**
10
 * Class AbstractNGrams
11
 */
12
abstract class AbstractNGrams implements NGramsInterface
13
{
14
    /**
15
     * {@inheritdoc}
16
     */
17
    abstract public function ngrams(array $data, int $n = 1);
0 ignored issues
show
Documentation introduced by
For interfaces and abstract methods it is generally a good practice to add a @return annotation even if it is just @return void or @return null, so that implementors know what to do in the overridden method.

For interface and abstract methods, it is impossible to infer the return type from the immediate code. In these cases, it is generally advisible to explicitly annotate these methods with a @return doc comment to communicate to implementors of these methods what they are expected to return.

Loading history...
Comprehensibility introduced by
Avoid variables with short names like $n. Configured minimum length is 3.

Short variable names may make your code harder to understand. Variable names should be self-descriptive. This check looks for variable names who are shorter than a configured minimum.

Loading history...
18
19
    /**
20
     * {@inheritdoc}
21
     */
22 1
    public function frequency(\Generator $ngrams, array $substring)
23
    {
24 1
        $ngrams = iterator_to_array($ngrams);
0 ignored issues
show
Coding Style introduced by
Consider using a different name than the parameter $ngrams. This often makes code more readable.
Loading history...
25
26 1
        return count(
27 1
            array_filter(
28 1
                $ngrams,
29
                function ($n) use ($substring) {
0 ignored issues
show
Comprehensibility introduced by
Avoid variables with short names like $n. Configured minimum length is 3.

Short variable names may make your code harder to understand. Variable names should be self-descriptive. This check looks for variable names who are shorter than a configured minimum.

Loading history...
30 1
                    return $n === $substring;
31 1
                }
32
            )
33 1
        )/count($ngrams);
34
    }
35
36
    /**
37
     * @param array $data
38
     * @param int $n
39
     * @param bool $cyclic
40
     *
41
     * @return bool|\Generator
0 ignored issues
show
Documentation introduced by
Consider making the return type a bit more specific; maybe use \Generator.

This check looks for the generic type array as a return type and suggests a more specific type. This type is inferred from the actual code.

Loading history...
42
     */
43 7
    protected function ngramsFactory(array $data, int $n, bool $cyclic)
0 ignored issues
show
Comprehensibility introduced by
Avoid variables with short names like $n. Configured minimum length is 3.

Short variable names may make your code harder to understand. Variable names should be self-descriptive. This check looks for variable names who are shorter than a configured minimum.

Loading history...
44
    {
45 7
        foreach ($this->doNgrams($data, $n, $cyclic) as $item) {
46 7
            yield $item;
47
        }
48 7
    }
49
50
    /**
51
     * @param array $data
52
     * @param int $n
53
     * @param bool $cyclic
54
     *
55
     * @return \Generator
56
     */
57 7
    private function doNgrams(array $data, int $n, bool $cyclic)
0 ignored issues
show
Comprehensibility introduced by
Avoid variables with short names like $n. Configured minimum length is 3.

Short variable names may make your code harder to understand. Variable names should be self-descriptive. This check looks for variable names who are shorter than a configured minimum.

Loading history...
58
    {
59 7
        $dataLength = count($data);
60 7
        $n = $n > $dataLength ? $dataLength : $n;
0 ignored issues
show
Coding Style introduced by
Consider using a different name than the parameter $n. This often makes code more readable.
Loading history...
61
62 7
        $ngrams = new NGrams($data, $n);
63
64 7
        $length = (false == $cyclic ? $dataLength - $n + 1 : $dataLength);
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like you are loosely comparing two booleans. Considering using the strict comparison === instead.

When comparing two booleans, it is generally considered safer to use the strict comparison operator.

Loading history...
65
66 7
        for ($j = 0; $j < $length; $j++) {
67 7
            yield array_slice($ngrams->current(), 0, $n);
68 7
            $ngrams->rewind();
69
        }
70 7
    }
71
}
72