Декодирайте информацията за разписка за транзакция на приложение за iPhone в PHP масив

{ "подпис" = "Alof/CEJ8a=="; "информация за покупка" = "ewoJIml0"; "среда" = "Тест"; "pod" = "100"; "статус на подписване" = "0"; }

Кой е най-добрият начин с PHP за анализиране на тази публикация за транзакция за покупка в приложение на iPhone в масив? Благодаря.


person user997463    schedule 16.10.2011    source източник
comment
Можете да замените = с : и ; с , и след това да използвате json_decode().   -  person bozdoz    schedule 16.10.2011
comment
@bozdoz Трябва да отговориш с това.   -  person Tim Lytle    schedule 16.10.2011
comment
Какво ще кажете за json_decode()?   -  person Alexsander Akers    schedule 16.10.2011
comment
@AlexsanderAkers Не е валидно JSON, просто изглежда, че иска да бъде.   -  person Tim Lytle    schedule 16.10.2011


Отговори (3)


Не съм сигурен, че това е „най-добрият“ начин, но е един от начините. Тъй като низът с данни е разделен от общи знаци (всеки ключ/стойност, зададен от ;, след това = между ключа/стойността), по-голямата част от анализирането може да се извърши с explode(). И можете да използвате trim() - с персонализиран списък със знаци - за да премахнете допълнителни знаци около целия низ и ключовете/стойностите.

Обърнете внимание, че това ще очаква ключът никога да няма = (въпреки че стойността може):

$data = '{ "signature" = "Alof/CEJ8a=="; "purchase-info" = "ewoJIml0"; "environment" = "Test"; "pod" = "100"; "signing-status" = "0"; }';

//remove the braces, spaces, and trailing semicolon
$data = trim($data, '{}; ');

$array = array();

//split on ';'
foreach(explode(';', $data) as $set){
  //parse key/value
  list($key, $value) = explode('=', $set, 2);
  $array[trim($key, '"\' ')] = trim($value, '"\' ');
}

print_r($array);

Изход:

Array
(
  [signature] => Alof/CEJ8a==
  [purchase-info] => ewoJIml0
  [environment] => Test
  [pod] => 100
  [signing-status] => 0
)
person Tim Lytle    schedule 16.10.2011

Можете да замените = с : и ; с , и след това да използвате json_decode().

Така:

$data = '{ "signature" = "Alof/CEJ8a=="; "purchase-info" = "ewoJIml0"; "environment" = "Test"; "pod" = "100"; "signing-status" = "0"; }';
$data = explode('" =',$data);
$data = implode('" :',$data);
$data = explode(';',$data);
array_pop($data);
$data = implode(',',$data);
$data = explode(' ',$data);
$data = implode('',$data);
$data .= "}";
$data = json_decode($data, true);

Вижте го тук.

person bozdoz    schedule 16.10.2011
comment
Какво ще кажете за замяна на "; с , и " = " с :. Това няма ли да го преобразува в JSON без explode/implode? preg_replace може да се използва в случай, че интервалът може да варира. - person Tim Lytle; 16.10.2011
comment
За мен това е по-малко за производителността, а повече за следващия човек, който трябва да погледне кода. Замяната изглежда по-ясна (поне за мен). - person Tim Lytle; 16.10.2011

$data = '{ "signature" = "Alof/CEJ8a=="; "purchase-info" = "ewoJIml0"; "environment" = "Test"; "pod" = "100"; "signing-status" = "0"; }';
$search = array('/\s\=\s/', '/;\s\}$/', '/;/');
$replace = array(':', '}', ',');
$json = preg_replace($search, $replace, $data);

print_r(json_decode($json));

Изход:

Array
(
    [signature] => Alof/CEJ8a==
    [purchase-info] => ewoJIml0
    [environment] => Test
    [pod] => 100
    [signing-status] => 0
)
person jslayer    schedule 18.10.2012