如何在PHP中查找字符串的所有子字符串

时间:2010-01-20 07:39:35

标签: php string substring

我需要转换格式

的字符串
"a b c"

到表格

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

PHP是否提供将字符串转换为所有子字符串的本机函数?如果没有,那么获得所有子串的阻力最小的路径是什么?是否有一种直接的方法可能爆炸()字符串,并使用数组操作生成所有[有序]排列?

干杯!

9 个答案:

答案 0 :(得分:13)

使用 in-php-array-is-the-duct-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);

答案 1 :(得分: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);

?>

即使有一个花哨的双线来完成这个,我怀疑它更有效或更容易理解(对于任何人理解它,他们可能不得不看看文档。大多数人可能得到什么substr没有甚至查找它。)

答案 2 :(得分: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);

?>

答案 3 :(得分:1)

子字符串不是排列。 explode()字符串,然后使用两个嵌套循环和array_slice()来获取相关元素。

答案 4 :(得分:1)

所有可能的子字符串

  <?php   
         $str1 = "ABCD";
         $len = strlen($str1);
         $arr = array();
         for($i = 0; $i < $len; $i++){  
             for($j = 0; $j < $len - $i; $j++){  
                 $arr [] = substr($str1,$i,($j+1));  
             }  
         }  

         echo(json_encode($arr));
     ?>

答案 5 :(得分:0)

他们已经可以考虑那种形式的数组。

只需使用以索引作为参数的函数来处理内容,并返回适当切割的字符串。

答案 6 :(得分: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);

答案 7 :(得分:0)

这是有效的,它也适用于多字节字符串,上面的所有方法都没有,它们返回null和重复的值。

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

答案 8 :(得分:-4)

即使是非常短的字符串,内存和运行时要求也会爆炸。即使在本机代码中,这也是一个可怕的性能问题。

证明你为什么需要这个功能,并找出解决问题的另一种方法。