如何将带分隔符的字符串更改为数组?
问题描述:
我有这个字符串.........如何将带分隔符的字符串更改为数组?
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
)
);
答
至少,这可以解决您的问题。
<?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);
答
好,因为它是均匀有序的,你可以使用这种方法:
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
到目前为止,你有什么,它是如何工作的。 – 2011-03-19 05:11:39
实际上它是一个带分隔符的编码数组......现在我想通过从字符串中删除分隔符来回原始数组。 – 0001 2011-03-19 05:13:51
你从哪里得到你的奇怪的字符串?它看起来与上一个版本相似。也许你可以使用'str_replace('&39avfy;','=',$ str)'事先清理它。 – mario 2011-03-19 05:14:47