2013-09-24 214 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