2012-06-04 80 views
2

我想從字符串中獲取一個簡單的數組。php:爆炸字符串

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

但由於某些原因,我得到以下錯誤:

Notice: Undefined index: heading on line 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,只有像'heading','zoom'等標籤的文字

+0

我已經更新了我的答案,包括正則表達式,與比'parse_str少黑客()':) –

回答

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); 
+0

解決同樣的問題是有$ mysql_data =修剪($ mysql_data)之間'任何區別;'並在''str_replace()'函數中加入'\ n'? – Omar

+0

'trim()'將從'$ mysql_data'的兩端刪除空格。上面的代碼並不真正關心空白。它只是將字符串轉換爲你想要的方式。 – flowfree

+0

我不知道你可以在數組中使用str_replace:我今天學到了一件新事物。順便說一句,謝謝!你的答案涵蓋了我的兩個問題,還有更多= =) – Omar

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黑客,該函數是用於已經正確的URL數據並且老實說,這是工作的錯誤工具。