【问题标题】:php: exploding stringsphp:爆炸字符串
【发布时间】:2012-06-04 02:22:14
【问题描述】:

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

Ej。 [位置] => ???? [标题] => ??? [音高] => ??? [缩放] => ???

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

注意:未定义索引:第 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,只需要标记为“标题”、“缩放”等的键

【问题讨论】:

  • 我已经更新了我的答案,加入了一个正则表达式,它用比parse_str() 更少的技巧解决了同样的问题 :)

标签: php string explode


【解决方案1】:

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 hacks,该函数适用于已经正确 URL 编码的数据,而且老实说,它是不适合这项工作的工具。

【讨论】:

    【解决方案2】:

    没有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);
    

    【讨论】:

    • $mysql_data = trim($mysql_data); 和在str_replace() 函数中添加\n 有什么区别吗?
    • trim() 将删除$mysql_data 两端的空格。虽然上面的代码并不真正关心空格。它只是按照你想要的方式将字符串转换为数组。
    • 我不知道您可以将 str_replace 与数组结合使用:O 我今天学到了一个新东西。顺便说一句,谢谢!您的回答涵盖了我的两个问题以及更多内容 =)
    猜你喜欢
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多