我有这样的字符串
$string = 'title,id,user(name,email)';
我希望结果像这样
Array
(
[0] => title
[1] => id
[user] => Array
(
[0] => name
[1] => email
)
)
到目前为止,我尝试使用explode函数和多个for循环代码变得丑陋,我认为必须通过使用像preg_split
之类的正则表达式来获得更好的解决方案。
答案 0 :(得分:1)
将逗号替换为嵌套数据集的###
,然后用逗号进行爆炸。然后对数组进行迭代,将嵌套数据集拆分为数组。示例:
$string = 'user(name,email),office(title),title,id';
$string = preg_replace_callback("|\(([a-z,]+)\)|i", function($s) {
return str_replace(",", "###", $s[0]);
}, $string);
$data = explode(',', $string);
$data = array_reduce($data, function($old, $new) {
preg_match('/(.+)\((.+)\)/', $new, $m);
if(isset($m[1], $m[2]))
{
return $old + [$m[1] => explode('###', $m[2])];
}
return array_merge($old , [$new]);
}, []);
print '<pre>';
print_r($data);
答案 1 :(得分:0)
首先要感谢@janie给我启发,我已经忙碌了一段时间,从昨天起我已经学会了一些正则表达式并尝试根据我的需要修改@janie回答套件,这是我的代码。
$string = 'user(name,email),title,id,office(title),user(name,email),title';
$commaBetweenParentheses = "|,(?=[^\(]*\))|";
$string = preg_replace($commaBetweenParentheses, '###', $string);
$array = explode(',', $string);
$stringFollowedByParentheses = '|(.+)\((.+)\)|';
$final = array();
foreach ($array as $value) {
preg_match($stringFollowedByParentheses, $value, $result);
if(!empty($result))
{
$final[$result[1]] = explode('###', $result[2]);
}
if(empty($result) && !in_array($value, $final)){
$final[] = $value;
}
}
echo "<pre>";
print_r($final);