2013-09-24 211 views
1

我在表列中有以下值是否有任何选项来获取​​值和merchant_email像数组?我知道使用爆炸和循环是可行的,但任何其他智能选项 ? 像事先$result->sandbox如何解析字符串到数组

paypal_merchant_email="[email protected]"|paypal_verified_only="0"|payment_currency=""|sandbox="1"|sandbox_merchant_email="[email protected]"|payment_logos=""|debug="0"|status_pending="W"|status_success="O"|status_canceled="D"|countries=""|min_amount="0"|max_amount="0"|secure_post=""|ipn_test=""|no_shipping="0"|address_override="0"|cost_per_transaction="0"|cost_percent_total="0"|tax_id=0| 

谢谢!

+2

是像HTTP ://stackoverflow.com/questions/15966693/explode-into-key-value-pair你的意思是? – rcs

+0

我认为OP知道如何用爆炸等来做到这一点,但问是否有更好的方式给出该字符串格式。我认为爆炸两次是非常好的... –

+0

[为什么不把你的响应作为JSON和简单的使用'json_decode($ result-> sandbox,TRUE);'?](https://developer.paypal.com/webapps/developer/docs/classic/api/gs_PayPalAPIs/)此外,它将有助于看到你目前使用的是什么。 – Prix

回答

1

小基准魔法:

<?php 
// explode 
$start = microtime(TRUE); 
$data = array(); 
foreach (explode('|', $result->sandbox) as $item) 
{ 
    if (empty($item)) continue; 
    list($key, $value) = explode("=", $item); 
    $data[$key] = str_replace('"', '', $value); 
} 
print_r($data); 
$stop = microtime(TRUE); 
$timeResult = $stop - $start; 
echo $timeResult, "\n"; 

//preg_split 
$start = microtime(TRUE); 
$data = array(); 
foreach (preg_split('/\|/', $result->sandbox) as $item) 
{ 
    if (empty($item)) continue; 
    list($key, $value) = preg_split('/=/', $item); 
    $data[$key] = str_replace('"', '', $value); 
} 
print_r($data); 
$stop = microtime(TRUE); 
$timeResult = $stop - $start; 
echo $timeResult, "\n"; 

//preg_match_all 
$start = microtime(TRUE); 
$data = array(); 
preg_match_all('/([^=]+)="([^"]+)?"\|/', $result->sandbox, $result); 
$data = array_combine($result[1], $result[2]); 
print_r($data); 
$stop = microtime(TRUE); 
$timeResult = $stop - $start; 
echo $timeResult, "\n"; 

结果:

Array 
(
    [paypal_merchant_email] => [email protected] 
    [paypal_verified_only] => 0 
    [payment_currency] => 
    [sandbox] => 1 
    [sandbox_merchant_email] => [email protected] 
    [payment_logos] => 
    [debug] => 0 
    [status_pending] => W 
    [status_success] => O 
    [status_canceled] => D 
    [countries] => 
    [min_amount] => 0 
    [max_amount] => 0 
    [secure_post] => 
    [ipn_test] => 
    [no_shipping] => 0 
    [address_override] => 0 
    [cost_per_transaction] => 0 
    [cost_percent_total] => 0 
    [tax_id] => 0 
) 
0.00029397010803223 

Array 
(
    [paypal_merchant_email] => [email protected] 
    [paypal_verified_only] => 0 
    [payment_currency] => 
    [sandbox] => 1 
    [sandbox_merchant_email] => [email protected] 
    [payment_logos] => 
    [debug] => 0 
    [status_pending] => W 
    [status_success] => O 
    [status_canceled] => D 
    [countries] => 
    [min_amount] => 0 
    [max_amount] => 0 
    [secure_post] => 
    [ipn_test] => 
    [no_shipping] => 0 
    [address_override] => 0 
    [cost_per_transaction] => 0 
    [cost_percent_total] => 0 
    [tax_id] => 0 
) 
0.00031495094299316 

另:

Array 
(
    [paypal_merchant_email] => [email protected] 
    [paypal_verified_only] => 0 
    [payment_currency] => 
    [sandbox] => 1 
    [sandbox_merchant_email] => [email protected] 
    [payment_logos] => 
    [debug] => 0 
    [status_pending] => W 
    [status_success] => O 
    [status_canceled] => D 
    [countries] => 
    [min_amount] => 0 
    [max_amount] => 0 
    [secure_post] => 
    [ipn_test] => 
    [no_shipping] => 0 
    [address_override] => 0 
    [cost_per_transaction] => 0 
    [cost_percent_total] => 0 
    [tax_id] => 0 
) 
0.00026917457580566 

Array 
(
    [paypal_merchant_email] => [email protected] 
    [paypal_verified_only] => 0 
    [payment_currency] => 
    [sandbox] => 1 
    [sandbox_merchant_email] => [email protected] 
    [payment_logos] => 
    [debug] => 0 
    [status_pending] => W 
    [status_success] => O 
    [status_canceled] => D 
    [countries] => 
    [min_amount] => 0 
    [max_amount] => 0 
    [secure_post] => 
    [ipn_test] => 
    [no_shipping] => 0 
    [address_override] => 0 
    [cost_per_transaction] => 0 
    [cost_percent_total] => 0 
    [tax_id] => 0 
) 
0.00028419494628906 
+0

基准测试的意义是什么?这是毫无意义的,你正在节省微秒。 –

+0

@RPM的意义在于向他展示他可以从一开始就做到这一点,看看哪种方法能够完成他所需要做的最好的事情,但随时可以生气。 – Prix

+0

你好像偷走了我的接受。但没关系。 –

1
$string = 'paypal_merchant_email="[email protected]"|paypal_verified_only="0"|payment_currency=""|sandbox="1"|sandbox_merchant_email="[email protected]"|payment_logos=""|debug="0"|status_pending="W"|status_success="O"|status_canceled="D"|countries=""|min_amount="0"|max_amount="0"|secure_post=""|ipn_test=""|no_shipping="0"|address_override="0"|cost_per_transaction="0"|cost_percent_total="0"|tax_id=0|'; 

$result = array(); 
$string = preg_split('/\|/', $string); 
foreach($string as $key => $value) 
{ 
    $value = str_replace('"', '', $value); 
    $value = preg_split('/=/', $value); 
    if(strlen($value[0])> 0) 
    { 
     $result[$value[0]] = array_key_exists(1, $value) ? $value[1] : NULL; 
    } 
} 

echo "<pre>"; 
print_r($result); 
echo "</pre>"; 

输出

Array 
(
    [paypal_merchant_email] => [email protected] 
    [paypal_verified_only] => 0 
    [payment_currency] => 
    [sandbox] => 1 
    [sandbox_merchant_email] => [email protected] 
    [payment_logos] => 
    [debug] => 0 
    [status_pending] => W 
    [status_success] => O 
    [status_canceled] => D 
    [countries] => 
    [min_amount] => 0 
    [max_amount] => 0 
    [secure_post] => 
    [ipn_test] => 
    [no_shipping] => 0 
    [address_override] => 0 
    [cost_per_transaction] => 0 
    [cost_percent_total] => 0 
    [tax_id] => 0 
    [] => 
) 
+0

感谢您的回答。如爆炸和循环相同寻找更好的选择bcoz循环是需要时间,如果字符串长度高 –

+0

请参阅我的编辑。将整个事物转化为关联数组比较容易。 –

+0

感谢您的时间+1努力 –

0

有一个功能parse_str(),但它是为&分隔符: http://php.net/manual/en/function.parse-str.php

或者你可以打动知识或PHP函数某人:

$str = 'a=13|b="string"|'; 

$rawarray = preg_split('/\|/', $str, -1, PREG_SPLIT_NO_EMPTY); 
$keys = array_map(create_function('$a', '$r = preg_split("/=/", $a); return $r[0];'), $rawarray); 
$values = array_map(create_function('$a', '$r = preg_split("/=/", $a, 2); return eval("return $r[1];");'), $rawarray); 
$result = array_combine($keys, $values); 

print_r($result); 
0

如果你只需要一个或两个值,使用正则表达式:

function get_value_from_string($key, $str) { 
    return preg_match('/\|'.$key.'=([^\|]*)/', '|'.$str, $matches) ? eval("return $matches[1];") : null; 
} 
+0

感谢您的回答,没有朋友我需要几乎所有的价值。 –

0

这是poss使用str_getcsv,array_walk,use,parse_str和古老的each(以提取键/值对)更优雅的解决方案。与您的数据:

$string = 'paypal_merchant_email="[email protected]"|paypal_verified_only="0"|payment_currency=""|sandbox="1"|sandbox_merchant_email="[email protected]"|payment_logos=""|debug="0"|status_pending="W"|status_success="O"|status_canceled="D"|countries=""|min_amount="0"|max_amount="0"|secure_post=""|ipn_test=""|no_shipping="0"|address_override="0"|cost_per_transaction="0"|cost_percent_total="0"|tax_id=0|'; 

理念,是先用str_getcsv解析| - 分隔线,然后利用快速的PHP函数穿越它。

$t = str_getcsv($string, "|"); 

此时,$ t是一个包含分解的“key = value”对的简单数组。

$new = array(); 
array_walk($t, function(&$a) use (&$new) { 
    parse_str($a, $b);   # parses each line, returns key-value 
    $c = each($b);    # need to obtain key-value from above 
    $new[$c["key"]] = $c["value"]; # simple assignment 
}); 

这需要PHP> 5.3.0,因为它在匿名函数中使用了名称空间(use)。但是,如果你做了这一步, print_r($new);给你:

Array (
    [paypal_merchant_email] => "[email protected]" 
    [paypal_verified_only] => "0" 
    [payment_currency] => "" 
    ... 
0

这里是你的非常紧凑的解决方案:

preg_match_all('/\|(.*?)="(.*?)"/', '|'.$string, $matches); 
$result = array_combine($matches[1], $matches[2]); 

测试在这里:https://3v4l.org/rfBuc