Ho provato ad aggiungere un controllo, affinchè nel caso le unita siano pari a 1 o a 8 mi venga scritto ventuno,trentuno al posto di ventiuno, trentauno ecc.

Codice PHP:
<?php
function numero_lettere($numero)
{
    if ((
$numero 0) || ($numero 999999999))
    {
        return 
"$numero";
    }

    
$milioni floor($numero 1000000);  // Milioni  
    
$numero -= $milioni 1000000;
    
$migliaia floor($numero 1000);    // Migliaia 
    
$numero -= $migliaia 1000;
    
$centinaia floor($numero 100);     // Centinaia 
    
$numero -= $centinaia 100;
    
$decine floor($numero 10);       // Decine 
    
$unita $numero 10;               // Unità 

    
$cifra_lettere "";

    if (
$milioni)
    {
            if (
$milioni == 1)            
            
$cifra_lettere .= numero_lettere($milioni) . "milione ";
            else
            
$cifra_lettere .= numero_lettere($milioni) . "milioni ";
    }

    if (
$migliaia)
    {
            if (
$migliaia == 1)            
            
$cifra_lettere .= numero_lettere($migliaia) . "mille ";
            else
            
$cifra_lettere .= numero_lettere($migliaia) . "mila ";
        
    }

    if (
$centinaia)
    {
          
$cifra_lettere .= numero_lettere($centinaia) . "cento ";
    }

    
$array_primi = array("""uno""due""tre""quattro""cinque""sei",
        
"sette""otto""nove""dieci""undici""dodici""tredici",
        
"quattordici""quindici""sedici""diciassette""diciotto",
        
"diciannove");
    
$array_decine = array("""""venti""trenta""quaranta""cinquanta""sessanta",
        
"settanta""ottanta""novanta");
    
$array_decine_tronc = array("""""vent""trent""quarant""cinquant""sessant",
        
"settant""ottant""novant");

    
    if (
$decine || $unita)
    {
        if (
$decine 2)
        {
            
$cifra_lettere .= $array_primi[$decine 10 $unita];
        }
        else
        {
            if (
$unita == || $unita == 8)
            
$cifra_lettere .= $array_decine_tronc[$decine];
            else
            
$cifra_lettere .= $array_decine[$decine];

            if (
$unita)
            {
            
$cifra_lettere .= $array_primi[$unita];
            }
        }
    }


    if (empty(
$cifra_lettere))
    {
        
$cifra_lettere "zero";
    }

    return 
$cifra_lettere;
}

$prezzo 3161391;

$letterale numero_lettere($prezzo);
if ( 
substr($letterale,-3) == 'uno')
$letterale str_replace("uno","",$letterale).'uno';

echo 
$letterale
// con substring tremilioni cento sessantmila trecento novantuno 
// senza substring tremilioni unocento sessantunomila trecento novantuno 

?>
Così facendo mi sono complicato ancora di più la vita. Come potete vedere dai commenti se vado ad applicare lo str_replace ottengo un output del tipo
tremilioni cento sessantmila trecento novantuno

A questo punto penso che l'unica soluzione sia un'espressione regolare sull'output della funzione. :master: