2016-10-20 20 views
2

我想從一個字符串來得到這樣獲取陣列模式 - KEY1:VAL1,VAL2,..; KEY2:VAL1,

color:blue,red;size:s 

於關聯多陣列

[ 
    color => [blue,red], 
    size => [s] 
] 

我試過([a-z]+):([a-z^,]+)但還不夠;我不知道如何遞歸它或什麼。

+1

也許嘗試使用爆炸(';',$ data);它會給你一些對,所以你可以使用foreach或數組步行 – Maytyn

+0

使用正則表達式,它[仍然沒有趣](https://ideone.com/HeQdPU),請使用下面的答案。 –

+0

@WiktorStribiżew特別是如果您不知道密鑰的名稱。 – Mike

回答

3

我不會使用像這樣的正則表達式。相反使用explode()幾次。

<?php 

$str = 'color:blue,red;size:s'; 

$values = explode(';', $str); 

$arr = []; 
foreach($values as $val) { 
    $parts = explode(':', $val); 
    $arr[$parts[0]] = explode(',', $parts[1]); 
} 

輸出:

Array 
(
    [color] => Array 
     (
      [0] => blue 
      [1] => red 
     ) 

    [size] => Array 
     (
      [0] => s 
     ) 

) 
0
$dataText = 'color:blue,red;size:s'; 

$data = explode(';', $dataText); 

$outputData = []; 

foreach ($data as $item){ 
    $itemData = explode(':', $item); 
    $outputData[$itemData[0]] = explode(',', $itemData[1]); 
} 

print_r('<pre>'); 
print_r($outputData); 
print_r('</pre>'); 
+0

這就像我的答案的確切副本:P – Mike

+1

剛剛意識到:D但認真,這是最簡單的方法。 – Maytyn

0

用正則表達式是不是那麼簡單的像爆炸,但你可以試試這個...

$re = '/(\w+)\:([^;]+)/'; 
$str = 'color:blue,red;size:s'; 
preg_match_all($re, $str, $matches); 
// Print the entire match result 
$result = array(); 
$keys = array(); 
for($i = 1; $i < count($matches); $i++) { 
    foreach($matches[$i] as $k => $val){ 
     if($i == 1) { 
      $result[$val] = array(); 
      $keys[$k] = $val; 
     } else { 
      $result[$keys[$k]] = $val; 
     } 
    } 
} 
echo '<pre>'; 
print_r($result); 
echo '</pre>'; 

結果

Array 
(
    [color] => blue,red 
    [size] => s 
) 
+0

從我收集的內容來看,這些值應該是數組。所以'藍色,紅色'應該是'[藍色,紅色]'。我不確定這樣做甚至可以在沒有「爆炸」的情況下完成。 – Mike

+0

對不起......我不明白。我還沒有找到在正則表達式中創建「子組」的方法。也許另一個正則表達式的價值? – cmnardi

+0

我並不精通正則表達式,所以我不知道是否可以匹配這樣的子組。 – Mike

相關問題