2014-10-14 6 views
8

Its working nicely का उपयोग करने में पिछले पत्र प्राप्त करने के लिए:लिए सबसे कारगर तरीका वर्णमाला पीएचपी

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

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

बहुत excel फ़ाइल में अगले स्तंभ नाम पाने के लिए उपयोगी इसके।

लेकिन अगर मैं का उपयोग कर समान कोड का उपयोग करें - ऑपरेटर उसके बाद पिछले पत्र प्राप्त करने के लिए अपने काम नहीं कर रहा:

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

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

क्या समाधान पिछले पत्र इसी तरह पाने के लिए हो सकता है? और इसका कारण क्या हो सकता है क्योंकि यह काम नहीं कर रहा है?

+0

? यदि आप चाहते हैं कि यह वर्तमान अल्पाहैबेट में वर्णों की गोलाकार लिंक्ड सूची बनाएं। – Margus

+0

@ मार्गस मान लीजिए कि मैं एक्सेल शीट का पिछला कॉलम नाम प्राप्त करना चाहता हूं। – itsazzad

उत्तर

-1

मैं इस तरह से हल कर सकते थे। यह कैसा है? विपक्ष यह है कि यह केवल अपरकेस को संभाल सकता है। कुछ और काम भी इसे ठीक कर सकते हैं।

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

क्या आपने मेरा अपडेट किया गया जवाब देखा? –

+0

@ हंकी 웃 पंकी हां, लेकिन इनपुट 'एएए' – itsazzad

+0

के लिए काम नहीं कर रहा है क्योंकि 'एएए' दी गई सीमा में नहीं है, सबसे पहले आपको उस उत्तर में एएए को शामिल करने के लिए ऊपरी सीमा को बदलने की आवश्यकता है जैसा पहले से ही टिप्पणियों में उल्लिखित है :) –

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

नोट: यह a-z के लिए परिपत्र नहीं है। कि

Fiddle

संपादित यह संपादन एक्सेल उदाहरण से अपने विशेष आवश्यकता के लिए शामिल किया गया है के लिए नियमों को जोड़ने की जरूरत है। हालांकि यह कोड का थोड़ा लंबा टुकड़ा है।

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

इसके लिए धन्यवाद लेकिन मुझे कुछ अलग चाहिए। जैसे कि इसमें कई वर्ण – itsazzad

+1

दिलचस्प शामिल होना चाहिए। मुझे देखने दो कि क्या हम इसके लिए कुछ आसान कर सकते हैं :) –

+0

संपादन देखें :) –

0

का उपयोग सरणी:

$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

ध्यान दें कि यह 1 रास्ता सर्कुलर लिंक्ड सूची है, खरीदें कि आप 2 तरीके सर्कुलर लिंक्ड सूची चाहते हैं। इसका निर्माण काफी समान है या जैसा कि वर्णमाला नहीं बदलता है, आप विभिन्न ऑर्डरिंग के साथ केवल 2 परिपत्र सूचियों का उपयोग कर सकते हैं। – Margus

+0

कम अनुभवी प्रोग्रामर के लिए सरणी का उपयोग करना आसान हो सकता है और पॉइंटर को बदल सकता है क्योंकि यह सीमाओं को हिट करता है। – Margus

+0

नोट यह मामला संवेदनशील खोज नहीं है! उन्हें कम मामले में परिवर्तित करना 'केस संवेदनशील खोज' बनाने के लिए उमलेट अक्षरों के लिए काम नहीं करेगा। – Margus

संबंधित मुद्दे