2013-09-24 9 views
1

У меня следующее значение в столбце таблицы есть ли опция для получения значения sandbox и merchant_email как массив? Я знаю, что использование explode и loop работает, но любые другие интеллектуальные опции ? что-то вроде $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

Я думаю, что ОП знает, как это сделать с взрывом и т. Д., Но спрашивает, есть ли лучший способ, заданный в этом строчном формате. Я думаю, что взорвать два раза достаточно хорошо ... –

+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] => samp[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

спасибо за ваш ответ. это то же самое, что и explode и loop iam, которые ищут лучший вариант 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

Вот вам более элегантное решение с использованием 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 представляет собой простой массив, содержащий разбитые пары «ключ = значение».

$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, поскольку он использует пространства имен (использование) в анонимной функции. Однако, если вы сделали это далеко, 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

Смежные вопросы