2010-01-20 17 views
5
में एक स्ट्रिंग के सभी सबस्ट्रिंग को खोजने के लिए कैसे

मैं प्रपत्रपीएचपी

Array 
(
    [0] => a 
    [1] => a b 
    [2] => a b c 
    [3] => b 
    [4] => b c 
    [5] => c 
) 

करता है PHP में तार बदलने के लिए एक देशी समारोह प्रदान की विन्यास में, प्रपत्र

"a b c" 

के तार बदलने की आवश्यकता सभी सबस्ट्रिंग्स? यदि नहीं, तो सभी सबस्ट्रिंग प्राप्त करने के लिए कम से कम प्रतिरोध का मार्ग क्या है? स्ट्रिंग को विस्फोट करने के लिए कोई सीधा तरीका है, और सभी [आदेशित] क्रमपरिवर्तन उत्पन्न करने के लिए एक सरणी सेशन का उपयोग करें?

चीयर्स!

उत्तर

13

का उपयोग में php-सरणी-है-वाहिनी-टेप के-ब्रह्मांड रास्ता: पी

function get_all_substrings($input, $delim = '') { 
    $arr = explode($delim, $input); 
    $out = array(); 
    for ($i = 0; $i < count($arr); $i++) { 
     for ($j = $i; $j < count($arr); $j++) { 
      $out[] = implode($delim, array_slice($arr, $i, $j - $i + 1)); 
     }  
    } 
    return $out; 
} 

$subs = get_all_substrings("a b c", " "); 
print_r($subs); 
+0

धन्यवाद - बिल्कुल वही जो मैं खोज रहा था! –

+1

इसके अलावा, सरणी/नली ​​टेप टिप्पणी के लिए +1। सच है। –

1

सबस्ट्रिंग क्रमपरिवर्तन नहीं हैं। explode() स्ट्रिंग, फिर प्रासंगिक तत्व प्राप्त करने के लिए array_slice() के साथ दो नेस्टेड लूप का उपयोग करें।

7
<?php 
function get_all_substrings($input){ 
    $subs = array(); 
    $length = strlen($input); 
    for($i=0; $i<$length; $i++){ 
     for($j=$i; $j<$length; $j++){ 
      $subs[] = substr($input, $i, $j);    
     } 
    } 
    return $subs; 
} 

$subs = get_all_substrings("Hello world!"); 
print_r($subs); 

?> 

एक फैंसी दो लाइनर यह पूरा करने के वहाँ यहां तक ​​कि अगर, मुझे शक है कि यह किसी भी अधिक कुशल या समझने में आसान (किसी को भी यह समझने के लिए वे शायद डॉक्स को देखने के लिए होगा है। अधिकांश लोगों को शायद मिल क्या सबस्ट्रेट इसे देखे बिना करता है)।

+0

mb_strlen और mb_substr किसी भी गैर मानक एन्कोडिंग के लिए इस्तेमाल किया जाना चाहिए बजाय – Karsten

+1

ल्यूकमेन के जवाब सही है। मुझे एहसास नहीं हुआ कि रिक्त स्थान महत्वपूर्ण थे। – echo

+0

हाँ - क्षमा करें, मैंने इसे और अधिक स्पष्ट बना दिया होगा। आपके द्वारा प्रदान की गई एल्गोरिदम हालांकि स्पॉट पर है - इनपुट के लिए धन्यवाद! –

-4

भी काफी छोटी स्ट्रिंग के लिए, स्मृति और रनटाइम आवश्यकता विस्फोट हो जाएगा । देशी कोड में भी यह एक डरावनी प्रदर्शन समस्या है।

जस्टिफ़ाई करें कि आपको इस फ़ंक्शन की आवश्यकता क्यों है, और समस्या के आसपास एक और तरीका काम करें।

0

वे पहले से ही उस रूप के सरणी के बारे में सोचा जा सकता है।

बस उस फ़ंक्शन के साथ सामग्री को संबोधित करें जो सूचकांक को पैरामीटर के रूप में लेता है और स्ट्रिंग को उचित रूप से कटा हुआ देता है। दूसरा एक को

3

माइनर सुधार:

<?php 
function get_all_substrings($input){ 
$subs = array(); 
$length = strlen($input); 
for($i=0; $i<$length; $i++){ 
    for($j=$i; $j<$length; $j++){ 
     $subs[] = substr($input, $i, ($j - $i) + 1);  
    } 
} 
return $subs; 
} 

$subs = get_all_substrings("abc"); 
print_r($subs); 

?> 
+0

सबस्ट्रेट फ़ंक्शन में दूसरे पैरामीटर में परिवर्तन को नोटिस करें। – Spartan

0

और इस सवाल का जवाब पुनरावर्ती के बिना पूरा नहीं होगा:

function get_substrings($str){ 
    $len = strlen($str); 
    $ans = array(); 
    $rest = array(); 
    for ($i = 1; $i <= $len; $i++) {     
     $ans[] = substr($str, 0, $i);   
    } 
    if($str){ 
     $rest = get_substrings(substr($str, 1)); 
    } 
    return array_merge($ans, $rest); 
} 

$subs = get_substrings("abc"); 
print_r($subs); 
0

यह काम करता है और यह multibyte तार, सभी तरीकों के साथ भी काम करता है ऊपर नहीं, वे शून्य और डुप्लिकेट मूल्य लौटते हैं।

function substrings($str, $charset = 'UTF-8') { 
    $length = mb_strlen($str, $charset); 

    $subs = []; 
    for ($i = 0; $i < $length; $i++) 
    for ($j = 1; $j <= $length; $j++) 
     $subs[] = mb_substr($str, $i, $j, $charset); 

    return array_unique($subs); 
} 

print_r(substrings("php"));