5

我需要转换形式的字符串

"a b c"

成形式的数组

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

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

干杯!

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

?>

即使有一个花哨的两条线来完成这个,我怀疑它是否更有效或更容易理解(任何人都可以理解它,他们可能不得不查看文档。大多数人可能甚至不看它就知道 substr 的作用向上)。

于 2010-01-20T07:56:11.693 回答
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);

?>
于 2010-12-02T09:14:29.320 回答
1

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

于 2010-01-20T07:49:54.323 回答
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));
     ?>
于 2019-04-12T10:27:48.793 回答
0

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

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

于 2010-01-20T10:03:39.450 回答
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

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

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"));
于 2014-10-31T15:04:19.800 回答
-4

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

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

于 2010-01-20T09:34:34.023 回答