PHP json-like-string拆分

时间:2010-08-09 14:04:50

标签: php string split

我有这个$ str值:

[{\"firstname\":\"guest1\",\"lastname\":\"one\",\"age\":\"22\",\"gender\":\"Male\"},{\"firstname\":\"guest2\",\"lastname\":\"two\",\"age\":\"22\",\"gender\":\"Female\"}]

我想将其拆分为以下内容:

firstname:guest1,lastname:one,age:22
firstname:guest2,lastname:two,age:22

我尝试了explode (",",$str),但是它爆炸了所有使用,作为分隔符,我没有得到我想要的

任何人都可以帮助我吗?

5 个答案:

答案 0 :(得分:5)

正如Josh K所指出的那样,看起来很像JSON字符串。也许你应该在它上面json_decode()来获取你正在寻找的实际的数据,所有这些都很好地组织成一个对象数组。

编辑:看来你的字符串本身包含在双引号"中,因此在你能够将其解码为有效的JSON之前,你必须将它们修剪掉:

$str_json = trim($str, '"');
$guests = json_decode($str_json);
var_dump($guests);

我使用var_dump()获得此输出,因此它绝对是有效的JSON:

array(2) {
  [0]=>
  object(stdClass)#1 (4) {
    ["firstname"]=>
    string(6) "guest1"
    ["lastname"]=>
    string(3) "one"
    ["age"]=>
    string(2) "22"
    ["gender"]=>
    string(4) "Male"
  }
  [1]=>
  object(stdClass)#2 (4) {
    ["firstname"]=>
    string(6) "guest2"
    ["lastname"]=>
    string(3) "two"
    ["age"]=>
    string(2) "22"
    ["gender"]=>
    string(6) "Female"
  }
}

JSON (JavaScript Object Notation)不是CSV (comma-separated values)。它们是两种截然不同的数据格式,因此您无法像另一种那样解析它们。

要获取两个字符串,请使用循环获取每个对象的键和值,然后使用这些值构建字符串:

foreach ($guests as $guest) {
    $s = array();

    foreach ($guest as $k => $v) {
        if ($k == 'gender') break;
        $s[] = "$k:$v";
    }

    echo implode(',', $s) . "\n";
}

输出:

firstname:guest1,lastname:one,age:22
firstname:guest2,lastname:two,age:22

(假设您确实想要出于某种原因排除性别;如果不是,请删除if ($k == 'gender') break;行。)

答案 1 :(得分:0)

如果你在,分开,那么你将获得围绕它的所有其他废话。然后你必须将其剥离。

看起来很像我的JSON数据,这个字符串来自哪里?

答案 2 :(得分:0)

如果这是有效的json,只需通过json_decode()运行即可获得本机php数组......

请注意,您可能需要首先通过stripslashes()运行它,因为看起来您可能已设置magic_quotes_gpc ...您可以通过使用函数get_magic_quotes_gpc进行有条件调用:

if (get_magic_quotes_gpc()) {
    $_POST['foo'] = stripslashes($_POST['foo']);
}
$array = json_decode($_POST['foo']);

答案 3 :(得分:0)

您需要使用 preg_replace 功能。

    $ptn = "/,\\"gender\\":\\"\w+\\"\}\]?|\\"|\[?\{/";
    $str = "[{\"firstname\":\"guest1\",\"lastname\":\"one\",\"age\":\"22\",\"gender\":\"Male\"},{\"firstname\":\"guest2\",\"lastname\":\"two\",\"age\":\"22\",\"gender\":\"Female\"}]";
    $rpltxt = "";
    echo preg_replace($ptn, $rpltxt, $str);

您可以php regular expression tester来测试结果。

或使用 preg_match_all

$ptn = "/(firstname)\\":\\"(\w+)\\",\\"(lastname)\\":\\"(\w+)\\",\\"(age)\\":\\"(\d+)/";
$str = "[{\"firstname\":\"guest1\",\"lastname\":\"one\",\"age\":\"22\",\"gender\":\"Male\"},{\"firstname\":\"guest2\",\"lastname\":\"two\",\"age\":\"22\",\"gender\":\"Female\"}]";
preg_match_all($ptn, $str, $matches);
print_r($matches);

答案 4 :(得分:0)

我仍然没有机会检索JSON: 我将修剪后的值var_dump为:

$str_json = trim($userdetails->other_guests, '"');
$guests = json_decode($str_json);
var_dump($str_json,$guests);

WHERE $userdetails->other_guests是我以前的$str值...

我得到以下输出:

string(169) "[{\"firstname\":\"guest1\",\"lastname\":\"one\",\"age\":\"22\",\"gender\":\"Male\"},{\"firstname\":\"guest2\",\"lastname\":\"two\",\"age\":\"23\",\"gender\":\"Female\"}]"
NULL

这意味着解码的json是NULL ...奇怪