Расположите слова в массиве в php - PullRequest
0 голосов
/ 31 января 2019

Перестановка слов в массиве на основе положения первого массива.В моем коде есть два массива, мой первый массив - это базовый массив, из которого я собираюсь сравнить его со вторым массивом и сделать позицию такой же, как в первом массиве.

Рассмотрим 2 ввода. Рассматривая 1 вход в качестве базы, я применяю левенштейн (метафон (каждая база данных слов), метафон (каждое слово банка)), затем на основе того, что слова банковских данных размещаются в новом массиве

databaseName = LAL BAHADUR SHASTRI bankdata = SHASTRI Исходный код LAL будет только переупорядочивать банковские данные и сохраняться в новом массиве, текущий вывод банковских данных: LAL SHASTRI

Перестановка происходит правильно, просто нужно упорядочить слова в массиве

            $db = 'LAL BAHADUR SHASTRI YADAV';
            $bank = 'SHASTRI LAL';
            $a = reArrangeArray($db,$bank);

            function reArrangeArray($db,$bank)
            {
                $dataBaseName = $db;
                $bankdataRows = [$db,$bank,];
                $dbWords = preg_split("#[\s]+#", $dataBaseName);     
                foreach ($bankdataRows as $bankdata)
                {
                $bankWords = preg_split("#[\s]+#", trim($bankdata));
                $result    = [];    
                if(!empty($bankWords))
                    foreach ($dbWords as $dbWord)
                    {
                    $idx   = null;
                    $least = PHP_INT_MAX;
                    foreach ($bankWords as $k => $bankWord)
                        if (($lv = levenshtein(metaphone($bankWord),metaphone($dbWord))) < $least)
                        {
                        $least = $lv;
                        $idx   = $k;
                        }
                    @$result[] = $bankWords[$idx];
                    unset($bankWords[$idx]);
                    }
                $result = array_merge($result, $bankWords);
                var_dump($result);
                }
            }

Случай 1: ТЕКУЩИЙ ВЫХОД

            array (size=4)
            0 => string 'LAL' (length=3)
            1 => string 'BAHADUR' (length=7)
            2 => string 'SHASTRI' (length=7)
            3 => string 'YADAV' (length=5)

            array (size=4)
            0 => string 'LAL' (length=3)
            1 => string 'SHASTRI' (length=7)
            2 => null
            3 => null

Ожидаемый вывод

Мне нужен массивпозиция такая же, как и в databaseArray

            $dbName = 'LAL BAHADUR SHASTRI YADAV';
            $bankName = 'SHASTRI LAL';

            array of db (size=4)
            0 => string 'LAL' (length=3)
            1 => string 'BAHADUR' (length=7)
            2 => string 'SHASTRI' (length=7)
            3 => string 'YADAV' (length=5)

            array of bankname (size=4)
            0 => string 'LAL' (length=3)
            1 => #
            2 => string 'SHASTRI' (length=7)
            3 => ###

, если слово не найдено в первом массиве, оно должно быть помещено с #, поскольку позиция равна 3, у которой нет соответствующего элемента, он имеет 3 #

Case2

Ввод:

$ dbName = NikithaRani MohanRao $ bankdata = Никита Рани Мохан Рао

Вывод: $ newbankdata = NikithaRani MohanRao

Itдолжен конкатенировать слово, если найдено, конкатенировать в $ dbName

1 Ответ

0 голосов
/ 12 августа 2019
            <?php  
            $DatabaseName = "LAL BAHADUR SHASTRI YADAV";
            $BankName = "SHASTRI LAL";

            $data = explode(" ", $DatabaseName);
            $bank = explode(" ", $BankName);
            sort($data);
            sort($bank);
            if($data == $bank){
                echo "true";
                exit;
             }

            $lev = 0;
            foreach($data as $key => $name){
                $lev += levenshtein($name, $bank[$key]);
            } 
            echo PHP_EOL . $lev; 
            ?>     
...