5

フォームの文字列を変換する必要があります

"a b c"

次の形式の配列に

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

PHP は、文字列をすべての部分文字列に変換するためのネイティブ関数を提供していますか? そうでない場合、すべての部分文字列を取得するための抵抗が最も少ない方法は何ですか? おそらく文字列をexplode()し、配列opを使用してすべての[順序付けられた]順列を生成する簡単な方法はありますか?

乾杯!

4

9 に答える 9

15

in-php-array-is-the-duct-tape-of-the-universe の方法を使用する:P

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);
于 2010-01-20T09:32:23.590 に答える
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);

?>

これを達成するための派手な2行があったとしても、それがより効率的で理解しやすいとは思えません(誰もがそれを理解するには、おそらくドキュメントを見なければならないでしょう.ほとんどの人は、おそらくそれを見なくてもsubstrが何をするかを理解するでしょう.上)。

于 2010-01-20T07:56:11.693 に答える
3

2番目のものへのマイナーな修正:

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

?>
于 2010-12-02T09:14:29.320 に答える
1

部分文字列は順列ではありません。explode()次に、2 つの入れ子になったループを とともに使用array_slice()して、関連する要素を取得します。

于 2010-01-20T07:49:54.323 に答える
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);
于 2012-09-07T17:50:43.643 に答える
0

それらはすでにその形式の配列と考えることができます。

インデックスをパラメーターとして取り、適切にスライスされた文字列を返す関数を使用して、コンテンツをアドレス指定するだけです。

于 2010-01-20T10:03:39.450 に答える
-4

非常に短い文字列であっても、メモリとランタイムの要件は爆発的に増加します。ネイティブ コードでも、これは恐ろしいパフォーマンスの問題です。

この関数が必要な理由を正当化し、問題を回避する別の方法を考えてください。

于 2010-01-20T09:34:34.023 に答える