2016-07-19 148 views
7

Sto cercando di individuare il modo migliore per eseguire la sostituzione delle stringhe con più regole di confronto.Sostituzione della stringa di foreach con più varianti

Ho una frase che viene inserita dall'utente, ho un array che di tutte le parole miss-spelled in quella frase e le loro potenziali correzioni.

$sentence = 'i want to recovary my vehical from the cabs';

voglio visualizzare il seguente:

  1. voglio recupero il mio veicolo dalle cabine
  2. voglio recuperare il mio veicolo dalle cabine
  3. voglio revary il mio veicolo dalle cabine

Codice finora:

$element = array(
    "vehical" => array('vehicle'), 
    "recovary" => array('recovery', 'recover', 'revary') 
); 

$sentence = 'i want to recovary my vehical from the cabs'; 

foreach($element as $i => $val){ 
    echo $i;  
} 

EDIT: Expanded un altro scenario:

cosa sarebbe successo se ci fosse più di una variazione nella gamma superiore.

"vehical" => array('vehicle', 'vehiclesy', 'whatever'), 
    "recovary" => array('recovery', 'recover', 'revary') 
  1. voglio recupero il mio veicolo dalle cabine
  2. voglio recupero mia vehiclesy dalle cabine
  3. voglio recupero il mio tutto ciò che dalle cabine
  4. Voglio recuperare la mia veicolo dalle cabine
  5. voglio recuperare il mio veicolo dalle cabine
  6. voglio recuperare il mio qualunque dalle cabine
  7. voglio revary mio veicolo dalle cabine
  8. voglio revary mia vehiclesy dalle cabine
  9. voglio revary il mio tutto ciò che dalle cabine

risposta

2

È necessario creare tutte le combinazioni univoche dei dati di sostituzione .Per ciascuna di queste combinazioni è quindi possibile effettuare la sostituzione. Questo è un modo per farlo:

<?php 
function createCombinations(array $input) 
{ 
    $head = array_shift($input); 
    $tail = count($input) > 1 ? createCombinations($input) : array_shift($input); 

    $combinations = []; 
    foreach ($head as $left) { 
     foreach ($tail as $right) { 
      $combinations[] = array_merge([$left], (array) $right); 
     } 
    } 

    return $combinations; 
} 

$element = [ 
    'vehical' => ['vehicle', 'car'], 
    'recovary' => ['recovery', 'recover', 'revary'], 
    'cubs'  => ['cabs'], 
]; 

$sentence = 'i want to recovary my vehical from the cubs'; 
$from = array_keys($element); 

foreach (createCombinations($element) as $to) { 
    echo str_replace($from, $to, $sentence), "\n"; 
} 

# => i want to recovery my vehicle from the cabs 
# => i want to recover my vehicle from the cabs 
# => i want to revary my vehicle from the cabs 
# => i want to recovery my car from the cabs 
# => i want to recover my car from the cabs 
# => i want to revary my car from the cabs 

demo:. https://ideone.com/LERb9X

2

Provare a usare str_replace() come,

$str=''; 
foreach($element as $search => $combinations){ 
    foreach($combinations as $comb){ 
     $str.=str_replace($search,$comb,$sentence)."\n"; 
    } 
} 
echo $str; 

Demo

Prova a rendere le funzioni e creare una matrice di tutte le combinazioni possibili poi ri posizionarlo utilizzando la matrice risultante come,

$element = array(
    "vehical" => array('vehicle', 'vehiclesy', 'whatever'), 
    "recovary" => array('recovery', 'recover', 'revary') 
); 

$sentence = 'i want to recovary my vehical from the cabs'; 

// change the array using loop for replacement 
function makeCombinations($combinations, $values) 
{ 
    $res = array(); 
    $i=0; 
    foreach($combinations as $comb) { 
     foreach($values as $value) { 
      $res[$i] = is_array($comb) ? $comb : array($comb); 
      $res[$i][] = $value; 
      $i++; 
     } 
    } 
    return $res; 
} 

$searchArr = array(); 
foreach($element as $search => $values) { 
    $searchArr[] = $search; 
    $combinations = isset($combinations) ? makeCombinations($combinations, $values) : $values; 
} 

// finally replace the strings 
foreach($combinations as $combination){ 
    echo str_replace($searchArr, $combination, $sentence),"\n"; 
} 

Demo

+0

appena ampliato la questione - scuse :( –

+0

@SophieRhodes cercano la mia risposta sta funzionando come previsto –

2

provare la seguente soluzione, utilizzando una secondi (foreach e str_replace()):

//the items with replacement values. 
$items = array(
    "vehical" => array('vehicle', 'vehiclesy', 'whatever'), 
    "recovary" => array('recovery', 'recover', 'revary'), 
    "cabs" => array('cups', 'cips'), 
    "from" => array(1, 2) 
); 

//init the initial sentence and the array with all solutions. 
$sentence = 'i want to recovary my vehical from the cabs'; 
$solution = []; 

//run through all keywords to execute the replacements. 
foreach ($items as $item => $value) { 
    if (count($value) > 0) { 
     if (count($solution) > 0) { 
      $solution = getReplacements($solution, $item, $value); 
     } else { 
      $solution = getReplacements($sentence, $item, $value); 
     } 
    } 
} 

//output the solutions. 
array_walk_recursive($solution, 'output'); 

function output(&$item,$key) { 
    echo $item."\n"; 
} 

/** 
* Function to execute the replacements. 
* @param array|string $sentence An array or string on which the replacements should execute. 
* @param string $item The word which will be replaced. 
* @param array $values The replacement values for the item. 
* @return array An array with all solutions of this function. 
*/ 
function getReplacements($sentence, $item, $values) 
{ 
    $solutions = []; 

    foreach ($values as $value) { 
     $sol = str_replace($item, $value, $sentence); 

     if (is_array($sol)) { 
      $solutions = array_merge($solutions, $sol); 
     } else { 
      $solutions[] = $sol; 
     } 
    } 

    return $solutions; 
} 

Dimostrazione:https://ideone.com/X2Pg1R

+0

appena ampliato la questione - scuse: ( –

+0

ha aggiornato la mia risposta ... - funziona ora con entrambi gli array e senza frasi sbagliate. –

Problemi correlati