PHP bir dize tüm alt dizeleri bulmak için nasıl

7 Cevap php

Ben formun dizeleri dönüştürmek gerekiyor

"a b c"

Formun dizilerine

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

PHP tüm alt dizelerin içine dizeleri dönüştürmek için bir yerel işlev sağlar mı? Değil, tüm alt dizeleri almak için en az direnç yolu nedir? (Belki) dize patlayabilir, ve tüm [emretti] permütasyon oluşturmak için bir dizi op kullanmak için basit bir yolu var mı?

Şerefe!

7 Cevap

P: in-php-array-is-the-duct-tape-of-the-universe şekilde kullanma

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

?>

Bunu gerçekleştirmek için bir fantezi, iki-liner var olsa bile herkes muhtemelen dokümanlar bakmak gerekiyor bunu anlamak için, ben (bunu anlamak için daha fazla verimli ve kolay şüpheliyim. Çoğu millet büyük olasılıkla daha bakmadan substr ne olsun kadar).

Altdizgeler permütasyon değildir. explode() dize, daha sonra ilgili unsurları elde etmek için array_slice() ile birlikte iki iç içe döngüler kullanın.

İkinci birine küçük düzeltme:

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

?>

Onlar zaten bu formun diziler düşünülebilir.

Sadece bir parametre olarak indeksini alır ve uygun dilimlenmiş dize döndüren bir fonksiyonu ile içeriğini adresi.

Ve bu soru yinelemeli yanıt olmadan tam olmayacaktır:

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);

Hatta oldukça kısa dizeler için, hafıza ve çalışma zamanı gereksinimi patlayacak. Hatta yerel kodda bu korkunç bir performans sorundur.

Eğer bu fonksiyonu neden ihtiyaç haklı ve soruna başka bir şekilde işe.