2014-06-06 46 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