基于PHP中的分隔符拆分文件 - 最佳选择是什么?

4

我想使用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
“explode”可能有些繁琐。你尝试使用正则表达式了吗? - mario
我的第一次尝试是类似于'/([.]\s[0-9])/',但我不认为这会给我想要的结果。它会给我类似于$splitstring[0]="saturn+5"; $splitstring[1]="57";$splitstring[2]="space+shuttle";等内容。所以我必须循环遍历数组,这样奇数索引就是键,偶数索引就是值,但这让我感到很麻烦。我认为有一种一步到位的方法可以立即执行奇偶索引分配。 - user3713442
4个回答

2

使用正则表达式实际上非常简单:

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

您只需要寻找由字母数字字符\w和可选的加号符+组成的组合,然后是一个空格,再接着是一个十进制数\d

array_combine函数将给您提供关联数组。


+1,对于一些非常优雅的正则表达式!但是像这样/([\w+]+)\s(\d+)/x应该可以正常工作,对吗? - Giacomo1968
1
@JakeGould 是的,x 修饰符确实是为了正则表达式的可读性。 - hwnd
@hwnd 啊!现在我知道x修饰符是用来干什么的了!收藏这个问题。太棒了。 - Giacomo1968

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
)

为什么需要重新索引数组? - Casimir et Hippolyte
您可以使用否定来跳过此步骤:foreach ($e as $k => $v) { if (!($k%2)) $inventory[$v] = $e[$k+1]; } - Casimir et Hippolyte
我来自于“做到就行”的编程学派,我的工作不是思考而是付费。 - user557846

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
)

谢谢,这个几乎可以用;看起来文件中有换行符或者一些我没有考虑到的奇怪字符。 我得到了这个: 数组([saturn+5] => 57 space_shuttle [34 gemini] => 12 mercury [2 soyuz+tm] - user3713442
@user3713442: 你可以在之前使用 trim - Casimir et Hippolyte
$foo_array = preg_split('/\s+/', $foo); - user557846
你可以使用以下代码改进循环:$length=count($foo_array);for ($i = 0; $i < $length ;$i++){ $hash[$foo_array[$i]] = $foo_array[++$i]; } - Casimir et Hippolyte

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
)

这个页面上有一些很好的解决方案,非常感谢。我选择了上面的选项,因为它是我尝试的第一个选项,而且它起作用了。 - user3713442

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接