Как найти все подстроки строки в PHP - PullRequest
5 голосов
/ 20 января 2010

Мне нужно преобразовать строки вида

"a b c"

в массивы вида

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

Предоставляет ли PHP встроенную функцию для преобразования строк во все подстроки? Если нет, каков путь наименьшего сопротивления для получения всех подстрок? Есть ли простой способ, возможно, взорвать () строку и использовать массив op для генерации всех [упорядоченных] перестановок?

ура!

Ответы [ 9 ]

13 голосов
/ 20 января 2010

Использование в-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);
7 голосов
/ 20 января 2010
<?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 голосов
/ 02 декабря 2010

Незначительная коррекция ко второму:

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

?>
1 голос
/ 12 апреля 2019

Все возможные подстроки

  <?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));
     ?>
1 голос
/ 20 января 2010

Подстроки не являются перестановками.explode() строку, затем используйте два вложенных цикла вместе с array_slice(), чтобы получить соответствующие элементы.

0 голосов
/ 31 октября 2014

Это работает и работает также с многобайтовыми строками, все вышеперечисленные методы не работают, они возвращают нулевые и дублированные значения.

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"));
0 голосов
/ 07 сентября 2012

И этот вопрос не будет завершен без рекурсивного ответа:

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);
0 голосов
/ 20 января 2010

Уже можно думать о массивах этой формы.

Просто обратитесь к содержимому с помощью функции, которая принимает индекс в качестве параметра и возвращает строку, нарезанную соответствующим образом.

0 голосов
/ 20 января 2010

Даже для очень коротких строк требования к памяти и времени выполнения будут расти.Даже в нативном коде это страшная проблема с производительностью.

Обоснуйте, зачем вам нужна эта функция, и попробуйте решить эту проблему иначе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...