PHP:爆炸数组元素

时间:2011-02-09 22:35:23

标签: php

我有一个2D数组,我从一个字符串中爆炸出来。一旦爆炸,这就是输出:

---> 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〜1 〜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〜 L〜3〜| 5.1〜53.44〜B〜1〜5.4〜8.48〜B〜2〜5.5〜15.53〜B〜3〜8〜7〜111.92〜7.0 ~~~假~~~~ | 6.8〜6.78〜 L〜1〜6.6〜148.39〜L〜2〜6.4〜3.7〜1〜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 

4 个答案:

答案 0 :(得分: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循环,它检查每个值并删除〜字符后的其余字符串。

最佳编码!

答案 1 :(得分: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[] = '';
   }
}

完成此操作后,$ output将包含所需信息。您也可以编写递归函数或使用正则表达式,但这两种解决方案都会有点复杂。

HTH

答案 2 :(得分:0)

您可以通过分解每一行,并获取第一个元素。

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

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

\|(.+?)~

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

答案 3 :(得分:0)

如果您只想在分隔符之前剪切字符串部分,请使用strtok()而不是explode()。

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

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