2015-05-04 94 views
0

如何在符号字符串“ - ”中甚至爆炸字?为前:如何从字符串中检索重复的子字符串?

$string = 'tshirt-blue-124-tshirt-blue-124-tshirt-blue-124'; 

$string = '333-red-333-red-333-red-333-red'; 

我需要数组是这样的:

$string[0] = 'tshirt-blue-124'; 
$string[1] = 'tshirt-blue-124'; 
$string[2] = 'tshirt-blue-124'; 

$string[0] = '333-red'; 
$string[1] = '333-red'; 
$string[2] = '333-red'; 
$string[3] = '333-red'; 

感谢

+0

是否已经提供了“单词”,或者您想从字符串中检测到它? – someOne

+0

我们应该假设字符串不会总是这样吗?如果是这样,那么*如何解决这个问题,知道要寻找什么? –

+0

你能为我们提供更多的一般信息吗?您的示例问题的解决方案很简单,但您想要实现什么目标?你想分析一个字符串中的三个字的批次吗? “甚至字符串词”是什么意思? – jeromegamez

回答

0

你可以做这样的事情

$string = 'tshirt-blue-124-tshirt-blue-124-tshirt-blue-124'; 
$tmp = explode("-", $string); 
while ($tmp) { 
       $output[] = implode('-', array_splice($tmp, 0, 3)); 
       } 
print_r($output); 
0

尝试用 -

$string = 'tshirt-blue-124-tshirt-blue-124-tshirt-blue-124'; 

$new = explode('-', $string); 
$i = 0; 
$result = array(); 
while ($i < count($new)) { 
    $result[] = $new[$i].'-'.$new[$i+1].'-'.$new[$i+2]; 
    $i += 3; 
} 
var_dump($result); 
3

如果它总是每隔三个要素:

$string = 'tshirt-blue-124-tshirt-blue-124-tshirt-blue-124'; 

$newArray = array_chunk(explode('-', $string), 3); 
array_walk(
    $newArray, 
    function(&$value) { 
     $value = implode('-', $value); 
}); 
var_dump($newArray); 

编辑

但是你必须知道提前多少元素:

$splitValue = 2; 
$string = '333-red-333-red-333-red-333-red'; 

$newArray = array_chunk(explode('-', $string), $splitValue); 
array_walk(
    $newArray, 
    function(&$value) { 
     $value = implode('-', $value); 
}); 
var_dump($newArray); 

编辑#2

如果你不知道有多少元素,有一个重复的块,然后寻找到。它建立在检测字符串重复并将其用于压缩的基础上。你可以使用一个Suffix Trie数据结构来简化逻辑。

编辑#3

作为一个简单的方法来试图确定分割尺寸:

function getSplitSize($string) { 
    $splitSize = 2; 
    do { 
     $tempArray = array_chunk(explode('-', $string), $splitSize); 
     if ($tempArray[0] == $tempArray[1]) 
      return $splitSize; 
     ++$splitSize; 
    } while ($splitSize <= count($tempArray)); 
    throw new Exception('No repetition found'); 
} 

function splitStringOnRepetition($string) { 
    $newArray = array_chunk(explode('-', $string), getSplitSize($string)); 
    array_walk(
     $newArray, 
     function(&$value) { 
      $value = implode('-', $value); 
     } 
    ); 
    return $newArray; 
} 


$string = 'tshirt-blue-124-tshirt-blue-124-tshirt-blue-124'; 
$array = splitStringOnRepetition($string); 
var_dump($array); 

$string = '333-red-333-red-333-red-333-red'; 
$array = splitStringOnRepetition($string); 
var_dump($array); 
+0

我编辑我的问题。在字符串中可以由4或5等元素组成。 – Haroldas

+0

但如果我不知道有多少元素在字符串中甚至是句子? – Haroldas

+0

如果你不知道有多少个元素组成一个块,它是否总是一个确切的值重复?即__not__'$ string ='tshirt-blue-124-tshirt-blue-125-tsh-blue-126';' –

0

爆发,

$string = explode("tshirt-", $string); 

现在你得值添加到每个阵列元件

foreach($string as &$v){ 
    $v = "tshirt-" . $v; 
    $v = rtrim($v, "-"); 
} 

这是一个非常简单易懂的解决方案。

1

对于先进而有效的方法,你可以使用正则表达式使用preg_match()匹配:

$string = 'tshirt-blue-124-tshirt-blue-125-tshirt-blue-126'; 
$pattern = "/([A-Za-z]*-[A-Za-z]*-[\d]*)-?/"; 
preg_match_all($pattern, $string, $matches); 

echo "<pre>"; 
print_r($matches[1]); 
echo "</pre>"; 

,它会输出:

Array 
(
    [0] => tshirt-blue-124 
    [1] => tshirt-blue-125 
    [2] => tshirt-blue-126 
) 

可以设置模式,你所希望的方式..

相关问题