【问题标题】:How to find all substrings of a string in PHP如何在PHP中查找字符串的所有子字符串
【发布时间】:2011-01-07 04:04:01
【问题描述】:

我需要转换表单的字符串

"a b c"

成数组形式

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

PHP 是否提供了将字符串转换为所有子字符串的本机函数?如果不是,那么获取所有子字符串的阻力最小的路径是什么?有没有一种简单的方法来explode() 字符串,并使用数组操作来生成所有[有序] 排列?

干杯!

【问题讨论】:

    标签: php string substring


    【解决方案1】:

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

    【讨论】:

    • 谢谢 - 正是我想要的!
    • 另外,阵列/管道胶带评论 +1。如此真实。
    【解决方案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);               
            }
        }
        return $subs;
    }
    
    $subs = get_all_substrings("Hello world!");
    print_r($subs);
    
    ?>
    

    即使有一个花哨的两条线来实现这一点,我怀疑它是否更有效或更容易理解(任何人要理解它,他们可能必须查看文档。大多数人可能会得到 substr 没有的东西甚至查找它)。

    【讨论】:

    • mb_strlen 和 mb_substr 应该用于任何非标准编码
    • 卢克曼的回答是对的。我没有意识到这些空间很重要。
    • 是的 - 抱歉,我可能已经说得更清楚了。您提供的算法本身是正确的 - 感谢您的输入!
    【解决方案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);
    
    ?>
    

    【讨论】:

    • 注意substr函数的第二个参数的变化。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      所有可能的子串

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

      【讨论】:

        【解决方案6】:

        它们已经可以被认为是那种形式的数组。

        使用以索引为参数并返回适当切片的字符串的函数来简单地处理内容。

        【讨论】:

          【解决方案7】:

          如果没有递归答案,这个问题将是不完整的:

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

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              【解决方案9】:

              即使是很短的字符串,内存和运行时需求也会激增。即使在本机代码中,这也是一个可怕的性能问题。

              说明为什么需要此功能,并找出解决问题的另一种方法。

              【讨论】:

                猜你喜欢
                • 2013-03-22
                • 1970-01-01
                • 2013-07-01
                • 2013-10-22
                • 2017-08-05
                • 1970-01-01
                • 1970-01-01
                • 2012-10-24
                • 1970-01-01
                相关资源
                最近更新 更多