2011-02-09 142 views
0

我有一个二维数组,我从一个字符串爆炸。一旦它爆炸这是输出:PHP:爆炸数组元素

---> 0 - 16~4~0.0~~~~false~~~~ 
---> 1 - 1000.0~21.75~L~1~2.0~2.0~L~2~ 
---> 2 - 
---> 0 - 2~5~951.3~6.4~~~false~~~~ 
---> 1 - 1000.0~11.77~L~1~ 
---> 2 - 
---> 0 - 3~6~1269.02~5.1~~~false~~~~ 
---> 1 - 5.0~213.66~L~1~4.9~2.56~L~2~4.6~19.5~L~3~ 
---> 2 - 5.1~53.44~B~1~5.4~8.48~B~2~5.5~15.53~B~3~ 

我想要让这个数组中的每个位置只需要前的第一个值〜。我不确定如何做到这一点。这是我的代码至今:

$test = explode(":", $string); 
foreach($test as &$value) $value = explode('|', $value); 

以防万一你需要它,这是原始的字符串输入:

1〜1〜828.32〜12.5 ~~~假~~~~ | 1000.0〜41.73〜L〜1〜2.0〜2.0〜L〜2〜|:4〜2〜4.16〜12.5 ~~~假~~~~ | 1000.0〜21.75〜L〜1〜2.0〜2.0〜L〜2 〜|:9〜3〜0.16〜24.0 ~~~假~~~~ | 1000.0〜21.75〜L〜1〜2.0〜2.0〜L〜2〜|:16〜4〜0.0 ~~~~假~~~ 〜| 1000.0〜21.75〜L〜1〜2.0〜2.0〜L〜2〜|:2〜5〜951.3〜6.4 ~~~假~~~~ | 1000.0〜11.77〜L〜1〜|:3〜6〜 1269.02〜5.1 ~~~假~~~~ | 5.0〜213.66〜L〜1〜4.9〜2.56〜L〜2〜4.6〜19.5〜1〜3〜| 5.1〜53.44〜B〜1〜5.4〜8.48〜乙〜2〜5.5〜15.53〜B〜3〜8〜7〜111.92〜7.0 ~~~假~~~~ | 6.8〜6.78〜1〜1〜6.6〜148.39〜L〜2〜6.4〜3.7〜L〜 3〜| 7.6〜128.0'...

我想输出是:

---> 0 - 16 
---> 1 - 1000.0 
---> 2 - 
---> 0 - 2 
---> 1 - 1000.0 
---> 2 - 
---> 0 - 3 
---> 1 - 5.0 
---> 2 - 5.1 
+0

我想我明白,但只是要清楚,你可以添加到期望的输出看起来像什么? – thirtydot 2011-02-09 22:47:17

+0

[strtok - Tokenize String](http://us2.php.net/manual/en/function.strtok.php) – drudge 2011-02-09 22:54:52

回答

2

如果我理解正确的话,你想利用这个阵列中的每个元素和第一〜字符后修剪掉一切。建立在你的代码:

$test = explode(":", $string); 
foreach($test as &$value) 
{ 
    $value = explode('|', $value); 
    foreach($value as &$inner_value) 
    { 
     $inner_value = substr($inner_value, 0, strpos($inner_value, '~')); 
    } 
} 

所有我加入了一个内部foreach循环检查每个值和〜字符后删除字符串的其余部分。

最佳编码的!

0

如果我明白你的问题,这应该工作:

$output = array(); 
$test = explode(":", $string); 
foreach($test as $value) { 
    $pipes = explode('|',$value); 
    foreach($pipes as $cur) { 
     $idx = strpos($cur,'~'); 
     if($idx > -1) { 
      $output[] = substr($cur,0,$idx); 
     } else $output[] = ''; 
    } 
} 

在此之后完成执行,$输出将包含所需信息。你也可以编写递归函数或使用正则表达式,但这两种解决方案都会更复杂一些。

心连心

0

您可以通过爆炸每一行,并采取的第一个元素。

$test = explode(":", $string); 
foreach($test as &$value) { 
    $value = explode('|', $value); 
    $result = explode('~', $value); 
    $first = $result[0]; 
} 

但我认为如果您只需要第一个元素,这可能会变得相当低效。正则表达式可能是另一种解决方案。就像这样:

\|(.+?)~ 

匹配一个|到第一~后,每串。这会在字符串的开始处中断,但可以用|作为正则表达式匹配的前缀。

0

如果你只是想剪出一个字符串的一部分,直到一个分隔符,然后用strtok()而不是爆炸()。

我不太让你的当前的例子。但它可能是:

foreach ($test as $i=>$value) { 
    $test[$i] = strtok($value, '|'); 
}