php:爆炸字符串

时间:2012-06-04 02:22:14

标签: php string explode

我正在尝试从字符串中获取一个简单的数组。

EJ。 [position] => ???? [heading] => ??? [pitch] => ??? [zoom] => ???

但由于某种原因,我收到以下错误:

  

注意:未定义的索引:第21行的标题

以下是PHP代码:

<?php
$mysql_data= 
"position: 34.032616, -118.286564|
heading: -159.50240187408838|
pitch: 0|
zoom: 2";


$pov = explode("|", $mysql_data);
foreach($pov as $key)
{
    $element = explode(": ", $key);
    $pov[ $element[0] ] = $element[1];
}
unset($element);


//Testing echoes
print_r($pov);
echo "\n";
echo $pov['heading'];
?>

此外,是否有一种更简单的方法可以一次性完成这一操作并一起跳过foreach?
顺便说一句:我不需要钥匙的0,1..etc,只有标有“朝向”,“缩放”等的标签

2 个答案:

答案 0 :(得分:6)

heading前面有换行符。

在你的循环中你应该trim()数组键(以及值以防万一):

$pov[ trim($element[0]) ] = trim($element[1]);

<强>更新

一个简单的正则表达式也会解决这个问题:

$s = <<<EOM
position: 34.032616, -118.286564|
heading: -159.50240187408838|
pitch: 0|
zoom: 2
EOM;

if (preg_match_all('/(\w+):([^|]+)/', $s, $matches)) {
    $pov = array_combine($matches[1], $matches[2]);
}

顺便说一句:不要使用parse_str黑客攻击,该功能适用​​于已经正确进行网址编码的数据,而且老实说这是错误的工具。

答案 1 :(得分:1)

在没有foreach()的情况下更简单的方法,假设输入字符串中没有换行符:

$str = 'position: 34.032616, -118.286564|heading: -159.50240187408838|pitch: 0|zoom: 2';
$str = str_replace(array('|',':'), array('&','='), $mysql_data);

parse_str($str, $pov);

print_r($pov);
/*
Array
(
    [position] =>  34.032616, -118.286564
    [heading] =>  -159.50240187408838
    [pitch] =>  0
    [zoom] =>  2
)
*/

如果输入字符串中有换行符,请更改str_replace args中的规则。

str_replace(array("\r\n","\n",'|',':'), array('','','&','='), $mysql_data);