在PHP中将字符串转换为数组

4
我有以下字符串:
["Day1"]["Morning"]=mutton&["Day1"]["Evening"]=Juice&["Day2"]["Morning"]=burger&["Day2"]["Evening"]=pizza 

我正在尝试将其转换为以下数组
$arr["Day1"]["Morning"] = "mutton";
$arr["Day1"]["Evening"] = "Juice";
$arr["Day2"]["morning"] = "burger";
$arr["Day2"]["evening"] = "pizza";

我尝试了以下类似的方法。
$str = '["Day1"]["Morning"]=mutton&["Day1"]["Evening"]=Juice&["Day2"]["Morning"]=burger&["Day2"]["Evening"]=pizza';
$pieces = explode("&", $str);

foreach($pieces as $pie)
{
$arr.$pie;
}
var_dump($arr);

我知道上面的代码真的很愚蠢 :/。有没有更好的解决方案?

你是怎么获取这些数据的?它看起来几乎不是标准的。 - Ja͢ck
我的客户数据库中有大量这样的数据...我正在尝试清理它。 - Vishnu
2个回答

5
您可以像这样做...
<?php
$str='["Day1"]["Morning"]=mutton&["Day1"]["Evening"]=Juice&["Day2"]["Morning"]=burger&["Day2"]["Evening"]=pizza';
$arr = explode('&',$str);
foreach($arr as $v)
{
    $valarr=explode('=',$v);
    preg_match_all('/"(.*?)"/', $valarr[0], $matches);
    $narr[$matches[1][0]][$matches[1][1]]=$valarr[1];
}

print_r($narr);

输出:

Array
(
    [Day1] => Array
        (
            [Morning] => mutton
            [Evening] => Juice
        )

    [Day2] => Array
        (
            [Morning] => burger
            [Evening] => pizza
        )

)

您可以像这样访问: echo $arr["Day1"]["Morning"],它将输出 mutton示例

1
完美得就像一块蛋糕:D,我能知道你在循环里做什么吗? - Vishnu
在循环内部,使用 = 将元素分解,并将最后一个元素分配为值。而第一个元素则被检查是否匹配双引号,并被捕获到另一个数组 $matches 中。因此,这些值将作为键被用于创建新数组。 - Shankar Narayana Damodaran

4

看起来可以使用parse_str()解析,但需要进行一些转换:

$str = '["Day1"]["Morning"]=mutton&["Day1"]["Evening"]=Juice&["Day2"]["Morning"]=burger&["Day2"]["Evening"]=pizza';

parse_str(preg_replace('/(?<=^|&)/', 'x', str_replace('"', '', $str)), $a);

var_dump($a['x']);

它会删除双引号,添加前缀x到每个项目,然后应用parse_str()。想要了解preg_replace()的作用,可以查看中间结果:

x[Day1][Morning]=mutton&x[Day1][Evening]=Juice&x[Day2][Morning]=burger&x[Day2][Evening]=pizza

解析上述字符串会得到一个只有一个根元素x的数组。

+1 对于一行代码! - Shankar Narayana Damodaran
+1 对于简单的解决方案 :) 但很抱歉我已经接受了答案。 - Vishnu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接