2011-03-19 92 views
1

我有这个字符串.........如何将带分隔符的字符串更改为数组?

0&39avfy;&39avfy;task&39avfy;rose&39avfy;duration&39avfy;1.25&39avfy;user&39avfy;15&39avfy;1&39avfy;&39avfy;task&39avfy;daisy&39avfy;duration&39avfy;0.75&39avfy;user&39avfy;25&39avfy;2&39avfy;&39avfy;task&39avfy;orchid&39avfy;duration&39avfy;1.15&39avfy;user&39avfy;7 

我需要数组这样..........

array( 
       array("task" => "rose", 
         "duration" => 1.25, 
         "user" => 15 
        ), 
       array("task" => "daisy", 
         "duration" => 0.75, 
         "user" => 25, 
        ), 
       array("task" => "orchid", 
         "duration" => 1.15, 
         "user" => 7 
        ) 
      ); 
+0

到目前为止,你有什么,它是如何工作的。 – 2011-03-19 05:11:39

+0

实际上它是一个带分隔符的编码数组......现在我想通过从字符串中删除分隔符来回原始数组。 – 0001 2011-03-19 05:13:51

+0

你从哪里得到你的奇怪的字符串?它看起来与上一个版本相似。也许你可以使用'str_replace('&39avfy;','=',$ str)'事先清理它。 – mario 2011-03-19 05:14:47

回答

1

至少,这可以解决您的问题。

<?php 

$in = '0&39avfy;&39avfy;task&39avfy;rose&39avfy;duration&39avfy;1.25&39avfy;user&39avfy;15&39avfy;1&39avfy;&39avfy;task&39avfy;daisy&39avfy;duration&39avfy;0.75&39avfy;user&39avfy;25&39avfy;2&39avfy;&39avfy;task&39avfy;orchid&39avfy;duration&39avfy;1.15&39avfy;user&39avfy;7'; 

$arr = explode('&39avfy;',$in); 
$out = array(); 
$i = 0; 
foreach($arr as $a){ 
    switch ($i) { 
     case 0: 
      if(isset($tmp)) { $out[] = $tmp; } 
      break; 
     case 3: 
      $tmp["task"] = $a; 
      break; 
     case 5: 
      $tmp["duration"] = $a; 
      break; 
     case 7: 
      $tmp["user"] = $a; 
      break; 
     default: 
    } 
    $i++; 
    $i%=8; 
} 
if($i == 0 && isset($tmp)) { $out[] = $tmp; } 
var_dump($out); 

array(3) { 
    [0]=> 
    array(3) { 
    ["task"]=> 
    string(4) "rose" 
    ["duration"]=> 
    string(4) "1.25" 
    ["user"]=> 
    string(2) "15" 
    } 
    [1]=> 
    array(3) { 
    ["task"]=> 
    string(5) "daisy" 
    ["duration"]=> 
    string(4) "0.75" 
    ["user"]=> 
    string(2) "25" 
    } 
    [2]=> 
    array(3) { 
    ["task"]=> 
    string(6) "orchid" 
    ["duration"]=> 
    string(4) "1.15" 
    ["user"]=> 
    string(1) "7" 
    } 
} 

这个代码将导致同样的结果:

<?php 

$in = '0&39avfy;&39avfy;task&39avfy;rose&39avfy;duration&39avfy;1.25&39avfy;user&39avfy;15&39avfy;1&39avfy;&39avfy;task&39avfy;daisy&39avfy;duration&39avfy;0.75&39avfy;user&39avfy;25&39avfy;2&39avfy;&39avfy;task&39avfy;orchid&39avfy;duration&39avfy;1.15&39avfy;user&39avfy;7'; 

$matches = array(); 
$regex = '/(\\d)&39avfy;&39avfy;task&39avfy;(.+?)&39avfy;duration&39avfy;(\\d+\\.\\d+)&39avfy;user&39avfy;(\\d+)/'; 
preg_match_all($regex, $in, $matches, PREG_SET_ORDER ); 
$out = array(); 
foreach($matches as $m){ 
    $tmp = array(); 
    $tmp['task'] = $m[2]; 
    $tmp['duration'] = $m[3]; 
    $tmp['user'] = $m[4]; 
    $out[$m[1]] = $tmp; 
} 
var_dump($out); 
2

好,因为它是均匀有序的,你可以使用这种方法:

preg_match_all('# 
        task  &39avfy; (?<task> [^&]*) .*? 
        duration &39avfy; (?<duration> [^&]*) .*? 
        user  &39avfy; (?<user> [^&]*) 
       \K #x', 
    $str, $matches, PREG_SET_ORDER); 

这将有一些数字数组项,但你可以过滤出来。更重要的是,如果您的分隔符更改,则更容易适应。

print_r($matches); 

[0] => Array 
    (
     [0] => 
     [task] => rose 
     [1] => rose 
     [duration] => 1.25 
     [2] => 1.25 
     [user] => 15 
     [3] => 15 
    ) 

[1] => Array 
    (
     [0] => 
     [task] => daisy 
     [1] => daisy 
     [duration] => 0.75 
     [2] => 0.75 
     [user] => 25 
     [3] => 25 
    ) 
+0

我用你的代码写了一个这样的函数......... – 0001 2011-03-19 05:54:17

相关问题