2014-10-14 11 views
8

Its working nicely:modo più efficace per ottenere precedente lettera dell'alfabeto utilizzando PHP

$str = 'a'; 
echo ++$str; // prints 'b' 

$str = 'z'; 
echo ++$str; // prints 'aa' 

E 'molto utile per ottenere il prossimo nome della colonna in un file excel.

Ma se io uso il codice simile utilizzando - operatore per ottenere la lettera precedente, allora la sua non funziona:

$str = 'b'; 
echo --$str; // prints 'b' but I need 'a' 

$str = 'aa'; 
echo --$str; // prints 'aa' but I need 'z' 

Quale può essere la soluzione per ottenere la lettera precedente simile? E quale può essere la ragione perché non funziona?

+0

Con quale cultura e l'alfabeto? Se vuoi, crea un elenco circolare circolare di caratteri nell'alfabeto corrente. – Margus

+0

@Margus Supponiamo di voler ottenere il nome della colonna precedente del foglio excel. – itsazzad

risposta

-1

ho potuto risolvere in questo modo. Come è? Lo svantaggio è che solo adesso è in grado di gestire le lettere maiuscole. Anche altri lavori possono risolverlo.

<?php 
function get_previous_letter($string){ 
    $last = substr($string, -1); 
    $part=substr($string, 0, -1); 
    if(strtoupper($last)=='A'){ 
     $l = substr($part, -1); 
     if($l=='A'){ 
      return substr($part, 0, -1)."Z"; 
     } 
     return $part.chr(ord($l)-1); 
    }else{ 
     return $part.chr(ord($last)-1); 
    } 
} 
echo get_previous_letter("AAAAAA"); 
?> 

CODEPAD

+0

Hai visto la mia risposta aggiornata? –

+0

@Hanky ​​웃 Panky Sì, ma questo non funziona per l'input 'AAA' – itsazzad

+0

Perché 'AAA' non è nell'intervallo specificato, per prima cosa è necessario modificare il limite superiore per includere AAA in quella risposta come già menzionato nei commenti :) –

5
$str='z'; 
echo chr(ord($str)-1); //y 

Nota: Questo non è circolare per a-z. Necessità di aggiungere le regole per quel

Fiddle

Modifica Questa modifica copre per il vostro requisito speciale da Excel esempio. Anche se è un pezzo di codice un po 'più lungo.

//Step 1: Build your range; We cant just go about every character in every language. 

$x='a'; 
while($x!='zz')   // of course you can take that to zzz or beyond etc 
{ 
    $values[]=$x++;  // A simple range() call will not work for multiple characters 
} 
$values[]=$x;   // Now this array contains range `a - zz` 

//Step 2: Provide reference 
$str='ab'; 

//Step 3: Move next or back 
echo $values[array_search(strtolower($str),$values)-1]; // Previous = aa 
echo $values[array_search(strtolower($str),$values)+1]; // Next  = ac 

Fiddle

+0

Grazie per questo ma ho bisogno di qualcosa di diverso. Come dovrebbe coprire più caratteri – itsazzad

+1

Interessante. Fammi vedere se riusciamo a trovare qualcosa di facile :) –

0

Uso matrice:

$cla=array('A', 'B', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 
'P', 'R', 'S', 'Š', 'Z', 'Ž', 'T', 'U', 'V', 'Õ', 'Ä', 'Ö', 'Ü'); 
$direction = -1; 
$element = 'Ü'; 
$element2 = $cla[((array_search($element,$cla)+count($cla)+$direction)%count($cla))]; 
+0

Nota: questa è una lista circolare circolare a 1 via, puoi comprare una lista circolare circolare a 2 vie. La costruzione di questo è abbastanza simile o dato che il set di caratteri non cambia potresti semplicemente usare 2 liste circolari con diversi ordini. – Margus

+0

Per programmatori meno esperti, potrebbe essere più semplice utilizzare la matrice e cambiare il puntatore quando raggiunge i limiti. – Margus

+0

Nota questa non è la ricerca di maiuscole e minuscole! La loro conversione in lettere minuscole creerebbe la ricerca "maiuscole e minuscole" per le lettere di umlaut. – Margus

Problemi correlati