Abhinav Gupta
Abhinav Gupta

Reputation: 511

Convert string into single array, PHP

I am working in a Laravel project. I want to convert a string into single array in efficient way.

String is $string = txn_status=0|txn_msg=success|txn_err_msg=NA|clnt_txn_ref=969239|tpsl_bank_cd=470|tpsl_txn_id=192630337|txn_amt=1.00|clnt_rqst_meta={itc:NIC~TXN0001~122333~rt14154~8 mar 2014~Payment~forpayment}{custname:test}|tpsl_txn_time=26-12-2015 15:56:20|tpsl_rfnd_id=NA|bal_amt=NA|rqst_token=hdfs-df-jkfhskjfhsjkd|hash=jhdsfs54367jhf,

And I want output look like below format. It is a json format:-

[ txn_status: "0",
  txn_msg : "success",
  txn_err_msg: "NA",
  .
  .
  .


  hash: "XYZ" ]

Upvotes: 1

Views: 152

Answers (3)

pespantelis
pespantelis

Reputation: 15372

You could use the preg_match_all in conjunction with the array_combine like this:

$string = "txn_status=0|txn_msg=success|txn_err_msg=NA|clnt_txn_ref=969239|tpsl_bank_cd=470|tpsl_txn_id=192630337|txn_amt=1.00|clnt_rqst_meta={itc:NIC~TXN0001~122333~rt14154~8 mar 2014~Payment~forpayment}{custname:test}|tpsl_txn_time=26-12-2015 15:56:20|tpsl_rfnd_id=NA|bal_amt=NA|rqst_token=hdfs-df-jkfhskjfhsjkd|hash=jhdsfs54367jhf";

preg_match_all("/([^|]+)=([^|]+)/", $string, $array);

$output = array_combine($array[1], $array[2]);

echo json_encode($output, JSON_PRETTY_PRINT);

http://ideone.com/eXf5K2

Or the preg_split like this:

$array = preg_split("/[|=]/", $string);
$output = [];

for ($i=0; $i<count($array); $i++) {
    $output[$array[$i]] = $array[++$i];
}

http://ideone.com/Y5k5bV

Or a simplified version of @devpro's code:

$array = explode("|", $string);
$output = [];

foreach ($array as $v) {
    list($key, $value) = explode("=", $v);
    $output[$key] = $value;
}

http://ideone.com/svrj8S

Upvotes: 2

devpro
devpro

Reputation: 16117

You can split as like that try this:

$string = "txn_status=0|txn_msg=success|txn_err_msg=NA|clnt_txn_ref=969239|tpsl_bank_cd=470|tpsl_txn_id=192630337|txn_amt=1.00|clnt_rqst_meta={itc:NIC~TXN0001~122333~rt14154~8 mar 2014~Payment~forpayment}{custname:test}|tpsl_txn_time=26-12-2015 15:56:20|tpsl_rfnd_id=NA|bal_amt=NA|rqst_token=hdfs-df-jkfhskjfhsjkd|hash=jhdsfs54367jhf";
$firstArray = explode("|", $string);
foreach ($firstArray as $key => $value) {
    $newArr = explode("=", $value);
    $myRequiredArr[$newArr[0]] = $newArr[1];
}

echo "<pre>"; // just for formatting
print_r($myRequiredArr); // print your result

Result is:

Array
(
    [txn_status] => 0
    [txn_msg] => success
    [txn_err_msg] => NA
    [clnt_txn_ref] => 969239
    [tpsl_bank_cd] => 470
    [tpsl_txn_id] => 192630337
    [txn_amt] => 1.00
    [clnt_rqst_meta] => {itc:NIC~TXN0001~122333~rt14154~8 mar 2014~Payment~forpayment}{custname:test}
    [tpsl_txn_time] => 26-12-2015 15:56:20
    [tpsl_rfnd_id] => NA
    [bal_amt] => NA
    [rqst_token] => hdfs-df-jkfhskjfhsjkd
    [hash] => jhdsfs54367jhf
)

Upvotes: 5

user4860986
user4860986

Reputation:

You can use the combination of php functions explode , array_map and call_user_func_array like as

$string = "txn_status=0|txn_msg=success|txn_err_msg=NA|clnt_txn_ref=969239|tpsl_bank_cd=470|tpsl_txn_id=192630337|txn_amt=1.00|clnt_rqst_meta={itc:NIC~TXN0001~122333~rt14154~8 mar 2014~Payment~forpayment}{custname:test}|tpsl_txn_time=26-12-2015 15:56:20|tpsl_rfnd_id=NA|bal_amt=NA|rqst_token=hdfs-df-jkfhskjfhsjkd|hash=jhdsfs54367jhf";
$arr = array();
array_map(function($v)use(&$arr){ $a = explode("=",$v); return $arr[$a[0]]  = $a[1];},explode('|',$string));
print_r($arr);

Working Demo

Upvotes: 1

Related Questions