2012-10-14 55 views
0

我有這個 string(245)「 - 當前地圖= VILLA - 當前任務= VEGAS JUNKYARD,別墅,總統府,殺死房屋,街道,三個國王賭場; - 可用任務= TRAINYARD,進出口,MURDERTOWN,CQB培訓,煉油廠,會議中心,劇院;「PHP,切割字符串

當前地圖始終是一個值, 當前任務和可用任務具有可變數量的值。


我想解析字符串,使我有一個數組,看起來像這樣:

Array ([Current Map] => VILLA [Current Missions] => Array ([0] => VEGAS JUNKYARD [1] => VILLA [2] => PRESIDIO [3] => KILL HOUSE [4] => STREETS [5] => THREE KINGDOMS CASINO) [Availible Missions] => Array ([0] => TRAINYARD [1] => IMPORT/EXPORT [2] => MURDERTOWN [3] => CQB TRAINING [4] => OIL REFINERY [5] => CONVENTION CENTER [6] => THEATER)) 

什麼工作:它的方式隔開了3層大的部分(當前地圖,當前任務,Availible Missions)

什麼不起作用:將「當前任務」和「可用任務」的多個值分隔到一個數組中。

錯誤(或者我只是愚蠢):注意前「菱使命」

$search_strs_maps = array('Current Map = ', '- Current Missions = ', '; - Available Missions = ', ';'); 

如果我把分號有它不覺得即使我敢肯定分號是什麼分號字符串。


原因,我把這個最高的是我不能弄清楚,爲什麼它沒有發現任何東西,當我把分號之前‘菱使命’,它的駕駛我瘋了。此外,我可以在代碼上使用第二套眼睛,並提供一些關於如何使其更好的建議。謝謝你的幫助!

這就是我到目前爲止所寫的內容。

<?php 
$str_map = '- Current Map = VILLA - Current Missions = VEGAS JUNKYARD, VILLA, PRESIDIO, KILL HOUSE, STREETS, THREE KINGDOMS CASINO; - Available Missions = TRAINYARD, IMPORT/EXPORT, MURDERTOWN, CQB TRAINING, OIL REFINERY, CONVENTION CENTER, THEATER;'; 
$search_strs_maps = array('Current Map = ', '- Current Missions = ', '- Available Missions = ', ';'); 
for ($i=0; $i<3; $i++){ 

       $str_map = trim ($str_map); 
       output($str_map, 'Complete String'); 
       //Cut of the beginning : "- Current Map = " 
       $start_pos = str_pos_last ($str_map, $search_strs_maps[$i]); 
       output($start_pos, 'Starting position'); 
       $str_map = substr($str_map, $start_pos); 
       output($str_map, 'String after first cut:'); 
       //Cut the remaining part to "Current Missions =" 
       $end_pos = strpos ($str_map, $search_strs_maps[$i+1]); 
       output($end_pos, 'End position'); 
       //Save the new string without for example "VILLA" 
       $ergebnis = substr($str_map, 0, $end_pos); 
       $ergebnis = trim ($ergebnis); 
       output($ergebnis, 'Finished result'); 
       $str_map = substr($str_map, $end_pos); 
       echo '<hr>'; 
       if ($i==0){ 
        $arr_return_strs['current_map'] = $ergebnis; 
       }else{ //arrays 
        //stupid semicolon that doesnt get cut of 
        $ergebnis = str_replace ($str_map, ';', ''); 
        $arr_maps_temp = array(); 
        //count the number of commas, if there is one comma that means there are 2 words, there is no comma at the end 
        $map_count = substr_count ($ergebnis, ',')+1; 
        for ($ii=0;$ii<$map_count;$ii++){ 
         echo '<hr'; 
         //cut at first comma 
         $result_pos = strpos($str_map, ','); 
         //save 
         $result_map = substr($str_map, 0, $result_pos); 
         //cut of the result+comma 
         $ergebnis = substr ($ergebnis, $result_pos); 
         output($result_map, 'Result is:'); 
        } 
       } 

      } 
    echo '<hr><hr><hr>'; 
    print_r ($arr_return_strs); 

function str_pos_last ($input_str, $search_str, $offset=0){ 
    //this function returns the endposition of a string we search for, strpos returns the beginning... 
    $str_begin = strpos ($input_str, $search_str); 
    $str_end = $str_begin + strlen($search_str); 
    return $str_end; 
} 

function output ($var, $desc){ 
echo $desc.'<br>'; 
var_dump ($var); 
echo '<hr>'; 
} 
?> 

回答

2
$initialString = "- Current Map = VILLA - Current Missions = VEGAS JUNKYARD, VILLA, PRESIDIO, KILL HOUSE, STREETS, THREE KINGDOMS CASINO; - Available Missions = TRAINYARD, IMPORT/EXPORT, MURDERTOWN, CQB TRAINING, OIL REFINERY, CONVENTION CENTER, THEATER;"; 


$resultArray = array(); 
$blockArray = explode('-',$initialString); 
foreach($blockArray as $setArray) { 
    if (!empty($setArray)) { 
     list($dataArrayKey, $dataArrayValues) = explode('=',$setArray); 
     $dataArrayKey = trim($dataArrayKey); 
     $dataArrayValues = trim($dataArrayValues,' ;'); 
     if ($dataArrayKey == 'Current Map') { 
      $resultArray[$dataArrayKey] = trim($dataArrayValues); 
     } else { 
      $dataArrayValues = explode('=', $dataArrayValues); 
      foreach($dataArrayValues as $dataArrayValue) { 
       $dataArrayEntries = explode(',',$dataArrayValue); 
       $resultArray[$dataArrayKey] = $dataArrayEntries; 
      } 
     } 
    } 
} 

var_dump($resultArray); 

array 
    'Current Map' => string 'VILLA' (length=5) 
    'Current Missions' => 
    array 
     0 => string 'VEGAS JUNKYARD' (length=14) 
     1 => string ' VILLA' (length=6) 
     2 => string ' PRESIDIO' (length=9) 
     3 => string ' KILL HOUSE' (length=11) 
     4 => string ' STREETS' (length=8) 
     5 => string ' THREE KINGDOMS CASINO' (length=22) 
    'Available Missions' => 
    array 
     0 => string 'TRAINYARD' (length=9) 
     1 => string ' IMPORT/EXPORT' (length=14) 
     2 => string ' MURDERTOWN' (length=11) 
     3 => string ' CQB TRAINING' (length=13) 
     4 => string ' OIL REFINERY' (length=13) 
     5 => string ' CONVENTION CENTER' (length=18) 
     6 => string ' THEATER' (length=8) 
+0

爲什麼使用第二個foreach循環?我不明白它的目的。難道你只是把「$ dataArrayValues = explode(',',$ dataArrayValues); $ resultArray [$ dataArrayKey] = $ dataArrayValues;」 – Diemex

+0

我可以這樣做......我也應該修剪$ dataArrayValue條目,因爲在所有當前和可用任務條目(除了第一個條目)的開始處都有一個虛假空間。我只是試圖提供一個快速和簡單的答案,不涉及所有複雜的strpos/substr等,以顯示爆炸和修剪可以更容易和有效地完成工作 –

0

這裏是你想要的東西:

<?php 

$str = '- Current Map = VILLA - Current Missions = VEGAS JUNKYARD, VILLA, PRESIDIO, KILL HOUSE, STREETS, THREE KINGDOMS CASINO; - Available Missions = TRAINYARD, IMPORT/EXPORT, MURDERTOWN, CQB TRAINING, OIL REFINERY, CONVENTION CENTER, THEATER;'; 

$parts = str_replace(array('- ', ';'), '', explode(' - ', $str)); 

foreach($parts AS $key => $part){ 
    $parts[$key] = explode(' = ', $part); 
    if($key != 0){ 
     $parts[$key][1] = explode(', ', $parts[$key][1]); 
    } 
} 

$final_array = array(); 
foreach($parts AS $part){ 
    $final_array[$part[0]] = $part[1]; 
} 

print_r($final_array); 

?> 

輸出:

Array 
(
    [Current Map] => VILLA 
    [Current Missions] => Array 
     (
      [0] => VEGAS JUNKYARD 
      [1] => VILLA 
      [2] => PRESIDIO 
      [3] => KILL HOUSE 
      [4] => STREETS 
      [5] => THREE KINGDOMS CASINO 
     ) 

    [Available Missions] => Array 
     (
      [0] => TRAINYARD 
      [1] => IMPORT/EXPORT 
      [2] => MURDERTOWN 
      [3] => CQB TRAINING 
      [4] => OIL REFINERY 
      [5] => CONVENTION CENTER 
      [6] => THEATER 
     ) 

) 
1

爲什麼不使用http://php.net/preg_match

$str = "- Current Map = VILLA - Current Missions = VEGAS JUNKYARD, VILLA, PRESIDIO, KILL HOUSE, STREETS, THREE KINGDOMS CASINO; - Available Missions = TRAINYARD, IMPORT/EXPORT, MURDERTOWN, CQB TRAINING, OIL REFINERY, CONVENTION CENTER, THEATER;" 

preg_match('~Current Map = (.*?) - Current Missions = (.*?); - Available Missions = (.*?);~ism',$str,$matches); 
echo '<pre>'; 
print_r($matches); 

Array 
(
[0] => Current Map = VILLA - Current Missions = VEGAS JUNKYARD, VILLA, PRESIDIO, KILL HOUSE, STREETS, THREE KINGDOMS CASINO; - Available Missions = TRAINYARD, IMPORT/EXPORT, MURDERTOWN, CQB TRAINING, OIL REFINERY, CONVENTION CENTER, THEATER; 
[1] => VILLA 
[2] => VEGAS JUNKYARD, VILLA, PRESIDIO, KILL HOUSE, STREETS, THREE KINGDOMS CASINO 
[3] => TRAINYARD, IMPORT/EXPORT, MURDERTOWN, CQB TRAINING, OIL REFINERY, CONVENTION CENTER, THEATER 
) 

然後就可以爆炸的結果

1

到其它實施例類似,但更簡單(其中$str是輸入字符串):

$types = array_map('trim', explode('-', substr($str, 1, strlen($str)))); 
$output = array(); 

foreach ($types as $value) { 
    $type = array_map('trim', explode('=', str_replace(';', '', $value))); 
    $opts = array_map('trim', explode(',', $type[1])); 
    $output[$type[0]] = (count($opts) == 1) ? $opts[0] : $opts;  
} 

var_dump($output); 

輸出

array 
    'Current Map' => string 'VILLA' (length=5) 
    'Current Missions' => 
    array 
     0 => string 'VEGAS JUNKYARD' (length=14) 
     1 => string 'VILLA' (length=5) 
     2 => string 'PRESIDIO' (length=8) 
     3 => string 'KILL HOUSE' (length=10) 
     4 => string 'STREETS' (length=7) 
     5 => string 'THREE KINGDOMS CASINO' (length=21) 
    'Available Missions' => 
    array 
     0 => string 'TRAINYARD' (length=9) 
     1 => string 'IMPORT/EXPORT' (length=13) 
     2 => string 'MURDERTOWN' (length=10) 
     3 => string 'CQB TRAINING' (length=12) 
     4 => string 'OIL REFINERY' (length=12) 
     5 => string 'CONVENTION CENTER' (length=17) 
     6 => string 'THEATER' (length=7)