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

{ "подпись" = "Alof/CEJ8a=="; "информация о покупке" = "ewoJIml0"; "среда" = "Тест"; "стручок" = "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