PHP json-like-string split - PullRequest
       0

PHP json-like-string split

1 голос
/ 09 августа 2010

У меня есть значение $ 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 ]

5 голосов
/ 09 августа 2010

Как указывает Джош К, это выглядит подозрительно как строка 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) не равно CSV (значения, разделенные запятыми) . Это два совершенно разных формата данных, поэтому вы не можете анализировать один как другой.

Чтобы получить две строки, используйте цикл для получения ключей и значений каждого объекта, а затем создайте строки с этими значениями:

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;.)

0 голосов
/ 10 августа 2010

У меня все еще нет шанса получить JSON: я var_dump усеченное значение как:

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

ГДЕ $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 ... странно

0 голосов
/ 09 августа 2010

Вам необходимо использовать функцию 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 тестер регулярных выражений , чтобы проверить результат.

или используйте 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);
0 голосов
/ 09 августа 2010

Если это действительный 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']);
0 голосов
/ 09 августа 2010

Если вы разделите на ,, то вы получите все остальные хрени, которые его окружают. Затем вам придется снять это.

Для меня это выглядит как данные JSON, откуда эта строка?

...