2010-06-04 13 views
8

यह प्रश्न पहले से ही अन्य सदस्यों द्वारा पूछा गया है/उत्तर दिया गया है लेकिन मेरा मामला थोड़ा अलग है ..स्ट्रिंग में शब्दों को कैसे उलटें?

समस्या: स्ट्रिंग में शब्दों को कैसे उलटें? आप strpos(), strlen(), substr() का उपयोग कर सकते हैं लेकिन अन्य बहुत उपयोगी कार्यों जैसे विस्फोट(), strrev() आदि

यह मूल रूप से एक साक्षात्कार प्रश्न है इसलिए मुझे तारों को कुशल बनाने की क्षमता प्रदर्शित करने की आवश्यकता है ।

उदाहरण:

$ स्ट्रिंग = "मैं एक लड़का हूँ"

उत्तर:

"मैं एमए एक yob"

नीचे मेरी समाधान है कि मुझे 2 दिन का समय लगा है (उच्छ्वास) लेकिन वहां अधिक सुरुचिपूर्ण समाधान होना चाहिए। मेरा कोड बहुत लंबा दिखता है ..

अग्रिम धन्यवाद!

मेरे इरादे:

1. get number of word 
2. based on number of word count, grab each word and store into array 
3. loop through array and output each word in reverse order 

कोड:

<?php 

$str = "I am a boy"; 

echo reverse_word($str) . "\n"; 

function reverse_word($input) { 
    //first find how many words in the string based on whitespace 
    $num_ws = 0; 
    $p = 0; 
    while(strpos($input, " ", $p) !== false) { 
     $num_ws ++; 
     $p = strpos($input, ' ', $p) + 1; 
    } 

    echo "num ws is $num_ws\n"; 

    //now start grabbing word and store into array 
    $p = 0; 
    for($i=0; $i<$num_ws + 1; $i++) { 
     $ws_index = strpos($input, " ", $p); 
     //if no more ws, grab the rest 
     if($ws_index === false) { 
      $word = substr($input, $p); 
     } 
     else { 
      $length = $ws_index - $p; 
      $word = substr($input, $p, $length); 
     } 
     $result[] = $word; 
     $p = $ws_index + 1; //move onto first char of next word 
    } 

    print_r($result); 
    //append reversed words 
    $str = ''; 
    for($i=0; $i<count($result); $i++) { 
     $str .= reverse($result[$i]) . " "; 
    } 
    return $str; 
} 

function reverse($str) { 
    $a = 0; 
    $b = strlen($str)-1; 
    while($a < $b) { 
     swap($str, $a, $b); 
     $a ++; 
     $b --; 
    } 
    return $str; 
} 

function swap(&$str, $i1, $i2) { 
    $tmp = $str[$i1]; 
    $str[$i1] = $str[$i2]; 
    $str[$i2] = $tmp; 
} 

?> 
+3

हमें पूछ आप के लिए एक साक्षात्कार सवाल का जवाब देने? :( –

+0

एफडब्ल्यूआईडब्ल्यू, कोड मुझे ठीक दिखता है। –

+1

@ इयान पी: उसने पहले ही इसका उत्तर दिया। वह पूछ रहा है कि ऐसा करने का एक और शानदार तरीका है। – webbiedave

उत्तर

17
$string = "I am a boy"; 

$reversed = ""; 
$tmp = ""; 
for($i = 0; $i < strlen($string); $i++) { 
    if($string[$i] == " ") { 
     $reversed .= $tmp . " "; 
     $tmp = ""; 
     continue; 
    } 
    $tmp = $string[$i] . $tmp;  
} 
$reversed .= $tmp; 

print $reversed . PHP_EOL; 
>> I ma a yob 
-1

http://php.net/strrev

संपादित करें: के लिए प्रत्येक शब्द उलट किया जाना है, लेकिन अभी भी "शब्द" के क्रम में आप से पूछा। कुछ इस तरह बेहतर काम कर सकते हैं:

$string = "I am a boy!"; 
$array = explode(" ", $string); 
foreach ($array as &$word) { 
    $word = strrev($word); 
} 
$rev_string = implode(" ", $array); 
+1

उसका/उसका प्रश्न अस्वीकार करता है! –

+0

हाँ, मैंने देखा कि मैंने जवाब दिया :) –

+0

यह जीता सही उत्तर उत्पन्न नहीं करते हैं, या तो। वह व्यक्तिगत रूप से प्रत्येक शब्द को पीछे हटाना चाहता है। – webbiedave

2

ओह! प्रश्न को गलत पढ़ें। यहाँ आप (ध्यान दें कि यह सभी गैर-पत्र सीमाओं, बस नहीं अंतरिक्ष पर विभाजित कर देगा आप एक चरित्र नहीं पर विभाजित किया जा चाहते हैं, बस $wordChars में जोड़ें।) जाना:

function revWords($string) { 
    //We need to find word boundries 
    $wordChars = 'abcdefghijklmnopqrstuvwxyz'; 
    $buffer = ''; 
    $return = ''; 
    $len = strlen($string); 
    $i = 0; 
    while ($i < $len) { 
     $chr = $string[$i]; 
     if (($chr & 0xC0) == 0xC0) { 
      //UTF8 Characer! 
      if (($chr & 0xF0) == 0xF0) { 
       //4 Byte Sequence 
       $chr .= substr($string, $i + 1, 3); 
       $i += 3; 
      } elseif (($chr & 0xE0) == 0xE0) { 
       //3 Byte Sequence 
       $chr .= substr($string, $i + 1, 2); 
       $i += 2; 
      } else { 
       //2 Byte Sequence 
       $i++; 
       $chr .= $string[$i]; 
      } 
     } 
     if (stripos($wordChars, $chr) !== false) { 
      $buffer = $chr . $buffer; 
     } else { 
      $return .= $buffer . $chr; 
      $buffer = ''; 
     } 
     $i++; 
    } 
    return $return . $buffer; 
} 

संपादित करें: अब यह एक ही समारोह है, और उलटा नोटेशन में बफर को बेवकूफ़ बना देता है।

EDIT2:() अब संभालती UTF8 वर्ण (बस $wordChars स्ट्रिंग के लिए "शब्द" वर्ण जोड़ने) ...

+0

प्रश्न strrev() – thetaiko

+0

@thetaiko धन्यवाद का उपयोग अस्वीकार करता है, मैंने शुरुआत में प्रश्न को गलत तरीके से पढ़ा। एक समाधान में संपादित ... – ircmaxell

+0

यूटीएफ -8 को संभालने के लिए अच्छा है। मैंने नियमित समाधान और संख्याओं के साथ-साथ एक समाधान भी जोड़ा। –

1

मेरा मानना ​​है कि सबसे आसान तरीका है विस्फोट का उपयोग कर एक सरणी में अपने स्ट्रिंग डालने के लिए हो सकता है और array_reverse() फ़ंक्शन का उपयोग करने से। बेशक आपको सरणी आउटपुट करना होगा। array_reverse अधिक जानकारी के लिए() को देखने के http://php.net/manual/en/function.array-reverse.php

0

यह एक बहुत अधिक सुरुचिपूर्ण तरीके से किया जा सकता था अगर पीएचपी concatenative वाक्य रचना :)

{ 
    "" "" 3 roll 
    { 
     dup " " == 
      { . . "" } 
      { swp . } 
     ifelse } 
    foreach . 
} "reverse" function 

"I am a boy" reverse echo // Prints "I ma a yob" 
0
$str = "Hello how are you"; 

$teststr = explode(" ",$str); 

for($i=count($teststr)-1;$i>=0;$i--){ 
echo $teststr[$i]." "; 
} 


Output : you are how hello 
+0

ओ/पी olleh woh rea uoy होना चाहिए .... आपने पूरी स्ट्रिंग को – Affan

0
<?php 
    // Reversed string and Number 
    // For Example : 
     $str = "hello world. This is john duvey"; 
     $number = 123456789; 
     $newStr = strrev($str); 
     $newBum = strrev($number); 

     echo $newStr; 
     echo "<br />"; 
     echo $newBum; 

OUTPUT : 
first : yevud nhoj si sihT .dlrow olleh 
second: 987654321 
+1

के रूप में किया है, प्रश्न में उल्लेखित स्ट्रैव का उपयोग करने की अनुमति नहीं है –

0

मेरा जवाब है इस्तेमाल किया गिनती करने के लिए स्ट्रिंग लम्बाई, अक्षरों को अक्षरों में विभाजित करें और फिर, इसे पीछे की तरफ लूप करें। यह जांचने का एक अच्छा तरीका भी है कि कोई शब्द पैलिंड्रोम है या नहीं। इसका उपयोग केवल नियमित स्ट्रिंग और संख्याओं के लिए किया जा सकता है।

preg_split को विस्फोट() में भी बदला जा सकता है।

/** 
* Code snippet to reverse a string (LM) 
*/ 

$words = array('one', 'only', 'apple', 'jobs'); 

foreach ($words as $d) { 
    $strlen = strlen($d); 
    $splits = preg_split('//', $d, -1, PREG_SPLIT_NO_EMPTY); 

    for ($i = $strlen; $i >= 0; $i=$i-1) { 
     @$reverse .= $splits[$i]; 
    } 

    echo "Regular: {$d}".PHP_EOL; 
    echo "Reverse: {$reverse}".PHP_EOL; 
    echo "-----".PHP_EOL; 
    unset($reverse); 
} 
संबंधित मुद्दे