2014-10-14 15 views
8

Its working nicely:Najbardziej skutecznym sposobem, aby uzyskać poprzedniej litery alfabetu z wykorzystaniem PHP

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

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

jej bardzo użyteczne, aby dostać kolejną nazwę kolumny w pliku excel.

Ale jeśli mogę użyć podobnego kodu przy użyciu - operator dostać poprzedniej litery następnie jej nie działa:

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

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

Co może być rozwiązanie, aby uzyskać poprzedniej litery podobnie? Co może być przyczyną, dla której nie działa?

+0

Z jaką kulturą i alfabetu? Jeśli chcesz, utwórz okrągłą listę znaków w bieżącej alpahabet. – Margus

+0

@Margus Załóżmy, że chcę uzyskać poprzednią nazwę kolumny arkusza programu Excel. – itsazzad

Odpowiedz

-1

mogę rozwiązać w ten sposób. Jak to jest? Wady polegają na tym, że teraz można obsługiwać tylko duże litery. Jeszcze więcej prac może to naprawić.

<?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

Czy widzisz moją zaktualizowaną odpowiedź? –

+0

@Hanky ​​웃 Panky Tak, ale to nie działa dla wejścia "AAA" – itsazzad

+0

Ponieważ 'AAA' nie znajduje się w podanym zakresie, najpierw musisz zmienić górny limit tak, aby uwzględniał AAA w tej odpowiedzi, jak już wspomniano w komentarzach :) –

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

Uwaga: to nie jest koliste dla a-z. Trzeba dodać zasady tej

Fiddle

Edycja Ta edycja obejmuje na specjalne wymogu z przykładu excel. Chociaż jest to nieco dłuższy kawałek kodu.

//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

Dzięki za to, ale potrzebuję czegoś innego. Powinien pokrywać wiele znaków. – itsazzad

+1

Interesujące. Pozwól mi zobaczyć, czy możemy wymyślić coś prostego :) –

+0

Zobacz edycję :) –

0

Korzystanie z tablicą:

$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

Uwaga, że ​​jest to jednokierunkowa, okrągła, połączona lista, kupuj może chcesz dwukierunkowej połączonej listy. Konstrukcja tego jest całkiem podobna lub jak nie zmienia się zestawu znaków, wystarczy użyć 2 okrągłe listy z inną kolejnością. – Margus

+0

Dla mniej doświadczonych programistów łatwiejsze może być korzystanie z tablicy i zmienianie wskaźnika w momencie trafienia. – Margus

+0

Pamiętaj, że to nie jest rozróżnianie wielkości liter! Przekształcenie ich w małe litery spowodowałoby, że "wyszukiwanie z rozróżnianiem wielkości liter" nie działałoby dla liter umlaut. – Margus

Powiązane problemy