Custom String Sorting

2

Hello, I have a problem, I need to sort a set of letters in alphabetical order, but the word order is customized from an order of specific letters.

<?php
     // Pega o conteudo do arquivo texto.
    $arquivo = file_get_contents("texto.txt") or die("Falha ao pega o conteudo!");
    // Pega as palavras do arquivo e guarda cada palavra em uma posição da array.
    $resultado = explode(" ", $arquivo);

    $ordenado = array();

    //array de inicialização do alfabeto booglan
    function cmpA($a,$b){
        $alfabeto_boo = array('t','w','h','z','k','d','f','v','c','j','x','l','r','n','q','m','g','p','s','b');

        if(strcmp(substr($a, 0,1), substr($b, 0,1)) == 0){
            echo "$a:$b<br>";
            return 0;
        }
        return (array_search($a,$alfabeto_boo) < array_search($b,$alfabeto_boo)) ? -1 : 1;
    }

    usort($resultado, "cmpA");
    echo '<pre>' . print_r($resultado,true) . '</pre>';

?>

But with usort, it is returning me computer, but not in the order determined by the proposed alphabet.

    
asked by anonymous 16.12.2017 / 05:36

1 answer

0

I created a script , based on yours, that will solve your problem. The code is commented on.

<?php 

$resultado  = array("wtps", "tdtt", "tktf"); // aqui é o resultado do explode
$posicoes = array();

echo '<pre>' . print_r($resultado ,true) . '</pre>';

/*

A função abaixo identifica as posições de cada caracter de cada string analisada

*/

function identificaPosicoes(&$string){
    $quantidadeDeCarcteres = 16; // aqui você define o máximo de caracteres que cada string terá
    // coloquei 16 pois acho que é suficiente
    $alfabeto_boo = array('t','w','h','z','k','d','f','v','c','j','x','l','r','n','q','m','g','p','s','b');
    $stringPos = array();
    for($x = 0; $x < $quantidadeDeCarcteres; $x++){
        if(isset($string[$x])){
            for($y = 0; $y < count($alfabeto_boo); $y++){
                if($string[$x] == $alfabeto_boo[$y]){
                    $stringPos[] = $y;
                }
            }
        } else {
            $stringPos[] = 0;
        }
    }
    return $stringPos;
}

$posicoes = array_map("identificaPosicoes",$resultado); // aqui ele analisa as posições e retona tudo para um array
asort($posicoes); // aqui ele ordena o array sem alterar o valor das chaves

$ordenados = array();
foreach($posicoes as $chave => $valor){
    $ordenados[] = $resultado[$chave]; // aqui ele pega o valor das chaves na ordem para ordenar o resultado
}

echo '<pre>' . print_r($ordenados,true) . '</pre>'; // aqui ele gera o resultado

Using your array:

array("nqkrm", "dbpvxzj", "bsthm", "cjwdc", "qflzwj", "mxnr", "xbzj", "pspb", "kcwr", "trf", "csw", "frqfs", "mmkrjpcz");

The result was this:

Array
(
    [0] => trf
    [1] => kcwr
    [2] => dbpvxzj
    [3] => frqfs
    [4] => cjwdc
    [5] => csw
    [6] => xbzj
    [7] => nqkrm
    [8] => qflzwj
    [9] => mxnr
    [10] => mmkrjpcz
    [11] => pspb
    [12] => bsthm
)
    
16.12.2017 / 06:57