我已经收到来自服务器的字符串响应,我将其转换为数组,但仍然无法确定如何从该数组访问值,例如
myarrray['txn_status'];
也来自字符串 clnt_rqst_meta
array(13) {
[0]=>
string(15) "txn_status=0399"
[1]=>
string(15) "txn_msg=failure"
[2]=>
string(55) "txn_err_msg=Transaction Cancelled : ERROR CODE TPPGE161"
[3]=>
string(17) "clnt_txn_ref=9178"
[4]=>
string(15) "tpsl_bank_cd=NA"
[5]=>
string(19) "tpsl_txn_id=T245107"
[6]=>
string(14) "txn_amt=121.00"
[7]=>
string(47) "clnt_rqst_meta={mob:9937253528}{custname:pawan}"
[8]=>
string(16) "tpsl_txn_time=NA"
[9]=>
string(15) "tpsl_rfnd_id=NA"
[10]=>
string(10) "bal_amt=NA"
[11]=>
string(47) "rqst_token=cd3f6f55-5990-4c3b-bb12-238eede827a0"
[12]=>
string(45) "hash=3cf25909ec73865d3200bc267119d3fcc21df463"
}
我知道使用regex / preg_match可以实现相同的目的,但是我确信必须有一些简单的方法来实现。
更新:从响应收到的实际字符串是这样的:
string(342) "txn_status=0399|txn_msg=failure|txn_err_msg=Transaction Cancelled : ERROR CODE TPPGE161|clnt_txn_ref=9178|tpsl_bank_cd=NA|tpsl_txn_id=T245107|txn_amt=121.00|clnt_rqst_meta={mob:9937253528}{custname:pawan}|tpsl_txn_time=NA|tpsl_rfnd_id=NA|bal_amt=NA|rqst_token=cd3f6f55-5990-4c3b-bb12-238eede827a0|hash=3cf25909ec73865d3200bc267119d3fcc21df463"
所以我用 $response =explode("|",$response_str);
您可以让PHP函数parse_str()
为您完成繁重的工作,但它希望收到一个标准查询字符串,其中的条目用分隔&
。您输入的字符串使用了另一个分隔符(|
),parse_str()
并且没有提供一种方法来告诉它使用哪个字符作为分隔符。
这个问题有一个非常简单的解决方案:在输入字符串中使用str_replace()
replace |
,&
然后将结果传递给parse_str()
:
$input = 'txn_status=0399|txn_msg=failure|txn_err_msg=Transaction Cancelled : ERROR CODE TPPGE161|clnt_txn_ref=9178|tpsl_bank_cd=NA|tpsl_txn_id=T245107|txn_amt=121.00|clnt_rqst_meta={mob:9937253528}{custname:pawan}|tpsl_txn_time=NA|tpsl_rfnd_id=NA|bal_amt=NA|rqst_token=cd3f6f55-5990-4c3b-bb12-238eede827a0|hash=3cf25909ec73865d3200bc267119d3fcc21df463';
parse_str(str_replace('|', '&', $input), $output);
print_r($output);
它产生:
Array
(
[txn_status] => 0399
[txn_msg] => failure
[txn_err_msg] => Transaction Cancelled : ERROR CODE TPPGE161
[clnt_txn_ref] => 9178
[tpsl_bank_cd] => NA
[tpsl_txn_id] => T245107
[txn_amt] => 121.00
[clnt_rqst_meta] => {mob:9937253528}{custname:pawan}
[tpsl_txn_time] => NA
[tpsl_rfnd_id] => NA
[bal_amt] => NA
[rqst_token] => cd3f6f55-5990-4c3b-bb12-238eede827a0
[hash] => 3cf25909ec73865d3200bc267119d3fcc21df463
)
实际观看:https://3v4l.org/KBaof
仅当输入字符串不包含&
和时,以上公开的解决方案才能正常工作%
。这些字符是查询字符串中的特殊字符,请parse_str()
尝试使用其特殊含义来解释它们,并且上面的代码会中断。
&
或时%
存在的解决方案$input = 'txn_status=0399|txn_msg=failure|txn_err_msg=Transaction Cancelled : ERROR CODE TPPGE161|clnt_txn_ref=9178|tpsl_bank_cd=NA|tpsl_txn_id=T245107|txn_amt=121.00|clnt_rqst_meta={mob:9937253528}{custname:pawan}|tpsl_txn_time=NA|tpsl_rfnd_id=NA|bal_amt=NA|rqst_token=cd3f6f55-5990-4c3b-bb12-238eede827a0|hash=3cf25909ec73865d3200bc267119d3fcc21df463';
$output = array_reduce(
explode('|', $input),
function($acc, $item) {
list($key, $value) = explode('=', $item, 2);
$acc[$key] = $value;
return $acc;
},
[]
);
print_r($output);
如果|
值中存在(例如...|txn_err_msg=a|b|clnt_txn_ref=...
),它仍然会失败,但是由于输入字符串的幼稚编码,因此此问题没有解决方案。
如果您可以修改生成输入数据的服务器,请对其进行更改以生成JSON输出。JSON是一种允许验证输入字符串的格式,PHP提供了编码和解码功能。双方的代码变得更加清晰。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句