2015-05-04 143 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 
) 

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

相關問題