2014-06-06 93 views
4

我想解析一個文件使用PHP,但我不知道最好的方式來做到這一點。該文件包含的東西,如:基於分隔符在php中分割文件 - 這是最好的使用?

saturn+5 57 space+shuttle 34 gemini 12 mercury 2 soyuz+tm 1 

我試圖做的是把它分解和填充哈希映射,所以..

$inventory["saturn+5"] = "57"; 
$inventory["space+shuttle"] = "34"; 
and so on. 

我不知道該如何處理這個。

我想寫一點正則表達式來處理文件分離出來的領域,但我沒有太多的運氣,並想知道如果我應該嘗試使用不同的方法使用split()explode()

+1

好吧,'爆炸'將是一個相當麻煩的方法。你有什麼正則表達式的嘗試? – mario

+0

我的第一次嘗試就像'/([.*]\s[0-9]*)/',但我不認爲這會給我想要的。它會給我類似 $ splitstring [0] =「saturn + 5」; $ splitstring [1] =「57」; $ splitstring [2] =「space + shuttle」; 等。所以我不得不通過數組循環,所以奇數索引將是關鍵和偶數索引的價值,但這讓我感到很累贅。我認爲有一種方法可以立即進行奇數/偶數索引分配。 – user3713442

回答

2

這是我使用正則表達式的方法。

$data = 'saturn+5 57 space+shuttle 34 gemini 12 mercury 2 soyuz+tm 1'; 

$inventory = array(); 

preg_match_all('/(\S+) (\S+)/', $data, $matches); 
foreach ($matches[1] as $index => $match) { 
    $inventory[$match] = $matches[2][$index]; 
} 
print_r($inventory); 

輸出

Array 
(
    [saturn+5] => 57 
    [space+shuttle] => 34 
    [gemini] => 12 
    [mercury] => 2 
    [soyuz+tm] => 1 
) 
+0

+1爲好的正則表達式! – JakeGould

+0

在這個頁面上有一些很棒的解決方案,非常感謝,我選擇了上面的選項,因爲它是第一個 – user3713442

2

我粗糙的方法:

<?php 
echo '<pre>'; 
$str="saturn+5 57 space+shuttle 34 gemini 12 mercury 2 soyuz+tm 1"; 

//break it on space 
$e=explode(' ',$str); 

//reindex array to start from 1 
array_unshift($e, "phoney"); 
unset($e[0]); 

print_r($e); 
$inventory=array(); 
foreach ($e as $k=>$v){ 

//detects odd key 
if(($k+2)%2==1) { 

$inventory[$v]= $e[$k+1]; 

    } 

} 

print_r($inventory); 

演示:http://codepad.viper-7.com/PN6K8m

輸出:

Array 
(
    [saturn+5] => 57 
    [space+shuttle] => 34 
    [gemini] => 12 
    [mercury] => 2 
    [soyuz+tm] => 1 
) 
+0

爲什麼你需要重新索引數組? –

+0

爲我的奇偶檢查;是的我可以做到另一種方式 –

+0

你可以使用否定來避免這一步:'foreach($ e = $ k => $ v){if(!($ k%2))$ inventory [$ v] = $ E [$ K + 1]; }' –

2

如果它總是按照這個順序,這將工作:

<? 

$foo = 'saturn+5 57 space+shuttle 34 gemini 12 mercury 2 soyuz+tm 1'; 
$foo_array = preg_split('/\s+/', $foo); 

$hash = array(); 
for ($i = 0; $i < count($foo_array); $i++){ 
    $i % 2 ? null : $hash[$foo_array[$i]] = $foo_array[++$i]; 
} 

print_r($hash); 
?> 

輸出:

php foo.php 
Array 
(
    [saturn+5] => 57 
    [space+shuttle] => 34 
    [gemini] => 12 
    [mercury] => 2 
    [soyuz+tm] => 1 
) 
+0

謝謝,這個差不多可以工作;看起來文件中有換行符,或者我沒有考慮過的奇怪東西。 我得到這個: Array([saturn + 5] => 57 space_shuttle [34 gemini] => 12 mercury [2 soyuz + tm] – user3713442

+0

@ user3713442:您可以在之前使用'trim'。 –

+0

'$ foo_array = preg_split( '/ $ s + /',$ foo);' –

2

它實際上是用正則表達式很簡單:

preg_match_all("/ ([\w+]+) \s (\d+) /x", $string, $m); 
$assoc = array_combine($m[1], $m[2]); 

你只是在尋找的字母數字字符\w和可選+符號的組合,那麼空間,然後一個\d十進制。

array_combine會給你關聯數組。

+0

+1對於一些非常優雅的正則表達式,但它應該像這樣工作得很好'/([\ w +] +)\ s(\ d +)/ x',對嗎? – JakeGould

+1

@JakeGould yes,the 'x'修飾符真正用於可讀性 – hwnd

+0

@hwnd Ahhhh!現在我知道'x'修飾符的用途了! estion。真棒的東西。 – JakeGould