代码之家  ›  专栏  ›  技术社区  ›  Chris Tonkinson

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

  •  5
  • Chris Tonkinson  · 技术社区  · 14 年前

    我需要转换窗体的字符串

    "a b c"
    

    在窗体的数组中

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

    PHP是否提供了将字符串转换为所有子字符串的本机函数?如果不是,得到所有子串的最小电阻路径是什么?是否有一种简单的方法可以分解()字符串,并使用数组op生成所有[有序]排列?

    干杯!

    8 回复  |  直到 10 年前
        1
  •  13
  •   Lukman    14 年前

    使用 在php数组中,是宇宙的管道胶带 方式: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);
    
        2
  •  7
  •   echo    14 年前
    <?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所做的,甚至不需要查找它)。

        3
  •  3
  •   Spartan    14 年前

    对第二个修正:

    <?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);
    
    ?>
    
        4
  •  1
  •   Ignacio Vazquez-Abrams    14 年前

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

        5
  •  0
  •   yosser    14 年前

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

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

        6
  •  0
  •   Nir Alfasi    12 年前

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

    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
  •   noun    10 年前

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

    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
  •   Will    14 年前

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

    证明您为什么需要这个函数,并找到解决问题的另一种方法。