Issues (1)

src/AbstractNGrams.php (1 issue)

1
<?php
2
3
declare(strict_types = 1);
4
5
namespace drupol\phpngrams;
6
7
use drupol\phpermutations\Iterators\NGrams;
0 ignored issues
show
This use statement conflicts with another class in this namespace, drupol\phpngrams\NGrams. Consider defining an alias.

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 1
    public function frequency(\Generator $ngrams, array $subset)
18
    {
19 1
        $ngrams = iterator_to_array($ngrams);
20
21 1
        return \count(
22 1
            array_filter(
23 1
                $ngrams,
24
                static function ($n) use ($subset) {
25 1
                    return $n === $subset;
26 1
                }
27
            )
28 1
        ) / \count($ngrams);
29
    }
30
31
    /**
32
     * {@inheritdoc}
33
     */
34
    abstract public function ngrams(array $data, int $n = 1);
35
36
    /**
37
     * @param array $data
38
     * @param int $n
39
     * @param bool $cyclic
40
     *
41
     * @return bool|\Generator
42
     */
43 7
    protected function ngramsFactory(array $data, int $n, bool $cyclic)
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)
58
    {
59 7
        $dataLength = \count($data);
60 7
        $n = $n > $dataLength ? $dataLength : $n;
61
62 7
        $ngrams = new NGrams($data, $n);
63
64 7
        $length = (false === $cyclic ? $dataLength - $n + 1 : $dataLength);
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