2014-07-31 3 views
0

Быстрый вариант вопросаНеверный перевод строки NVP в массив ..?

Я пытаюсь взять строку, как это ...

BUTTONSOURCE[18]=AngellEYE_PHPClass&VERBOSITY[4]=HIGH&USER[6]=tester 

и превратить его в этом для целей лесозаготовок ...

BUTTONSOURCE[18]=AngellEYE_PHPClass 
VERBOSITY[4]=HIGH 
USER[6]=tester 

Детальный вариант вопроса

Я знаю AYS использовали эту функцию, чтобы преобразовать строку НВП в массив без каких-либо проблем ...

function NVPToArray($NVPString) 
{ 
    $proArray = array(); 
    while(strlen($NVPString)) 
    { 
     // name 
     $keypos= strpos($NVPString,'='); 
     $keyval = substr($NVPString,0,$keypos); 
     // value 
     $valuepos = strpos($NVPString,'&') ? strpos($NVPString,'&'): strlen($NVPString); 
     $valval = substr($NVPString,$keypos+1,$valuepos-$keypos-1); 
     // decoding the respose 
     $proArray[$keyval] = urldecode($valval); 
     $NVPString = substr($NVPString,$valuepos+1,strlen($NVPString)); 
    } 

    return $proArray; 

} 

Я вытащил откуда-то давным-давно, и я использовал его до сих пор. Теперь, однако, я работаю с строкой NVP, которая включает [x] значения в именах параметров, чтобы показать значение lengh. Например,

BUTTONSOURCE[18]=AngellEYE_PHPClass&VERBOSITY[4]=HIGH... 

Когда я запускаю строку подобного в моей функции, хотя, [] 's вызывают его, чтобы увидеть его в качестве индекса массива, и я в конечном итоге с массивом, как это .. .

Array 
(
    [BUTTONSOURCE] => Array 
     (
      [18] => AngellEYE_PHPClass 
     ) 

    [VERBOSITY] => Array 
     (
      [4] => HIGH 
     ) 

Итак, если я попробовать что-то вроде этого ...

 foreach($string_data_array as $var => $val) 
     { 
      $string_data_indiv .= $var.'='.$val.chr(13); 
     } 

Я в конечном итоге с «массив для преобразования строки» PHP Обратите внимание и мой результат выглядит следующим образом ...

BUTTONSOURCE=Array 
VERBOSITY=Array 

То, что я пытаюсь закончить, - это хороший разрыв строки NVP, по одной строке за раз. Так это то, что я ожидал ...

BUTTONSOURCE[18]=AngellEYE_PHPClass 
VERBOSITY[4]=HIGH 

я могу идти об этом сумасшедшем пути, который может быть намного проще, но я никогда не имел никаких проблем с таким родом вещей, пока я не начал работать с строкой NVP, которая включает в себя количество символов, подобное этому.

Любая информация о том, как я могу решить эту проблему, была бы весьма признательна. Благодаря!

+0

Вы обновили ваш PHP версии? У меня нет проблем с PHP5.5. – Debflav

+0

В настоящее время я работаю 5.5.12 –

+0

Каков формат шрифта? Почему бы просто не сопоставить все, что вам нужно, с 'preg_match_all()'? –

ответ

1

PHP предоставляет функцию для этого: parse_str.

Примечание: Он правильно обрабатывает символы «url закодированные» в соответствии с примером в руководстве.

Как обычно, это оказалось более сложным, чем я думал раньше. -/

Хм, это «довольно хрупким», как функции - например, вы не можете «UrlEncode» вся строка и есть parse_str расшифровывает его как тот же NVP-х. Тем не менее, вы можете 'urlencode()' any _name_value_pair_, и он правильно их декодирует. Эта функция является «полезной», но не является общей, как я хочу.

1) The array characters '[' and ']' are used by PHP in a special manner. 
2) The parameters may just be normal NVP's e.g. 'Param01=PlainText' 
3) The parameter may be URL encoded. e.g. %3CParam42_URLEncodedWithSpecialChars%3E%3DThisIs42%21 

Во-первых, parse_str обрабатывает все вышеперечисленные форматы, но элементы массива, полученные не из формата «последовательной».

Этот код пытается принять различные форматы NVP в одной строке и создавать разумные выходы. Это должно сделать это «общего» использования.

Испытано код: PHP 5.3.18 Source Code at Pastebin.com

Функция, которая разбирает строку NVP:

function NVPToArray($NVPString) { // replacement for the original 
    $parsed = array(); 
    parse_str($NVPString, $parsed); 

    // convert it to an an associated array with the required formats: 
    $nvpArray = array(); 
    foreach($parsed as $parsedName => $parsedValue) { 
     if (is_array($parsedValue)) { 
      $nvpName = $parsedName .'['. key($parsedValue) .']'; 
      $nvpValue = current($parsedValue); 
     } 
     elseif (empty($parsedValue)) { // was url encoded 
      $parsedKeyAndValue = explode('=', $parsedName); 
      $nvpName = $parsedKeyAndValue[0]; 
      $nvpValue = $parsedKeyAndValue[1]; 
     } 
     else { 
      $nvpName = $parsedName; 
      $nvpValue = $parsedValue; 
     } 

     $nvpArray[$nvpName] = $nvpValue; 
    } 
    return $nvpArray; 
} 

Ниже приведен пример кода, который использует функцию и отображает результат:

Данные:

$p1 = 'ParamNoLength=PlainTextIsItAnArray'; 
$p2 = 'ParamNoLengthUrlEncoded=EncodedTextIsItAnArray'; 
$p3 = '<Param42_URLEncodedWithSpecialChars>=ThisIs42!'; 

$src = 'BUTTONSOURCE[18]=AngellEYE_PHPClass&VERBOSITY[4]=HIGH' 
     .'&'. $p1 
     .'&'. urlencode($p2) 
     .'&'. urlencode($p3); 

Код:

$nvpArray = NVPToArray($src); 

echo '<br />Input NVP string:<pre>'; 
var_dump($src, __FILE__.__LINE__); 
echo '</pre>'; 

echo '<br />Output:<pre>'; 
var_dump($nvpArray, __FILE__.__LINE__); 
echo '</pre>'; 

Входные данные:

'BUTTONSOURCE[18]=AngellEYE_PHPClass&VERBOSITY[4]=HIGH&ParamNoLength=PlainTextIsItAnArray&ParamNoLengthUrlEncoded%3DEncodedTextIsItAnArray&%3CParam42_URLEncodedWithSpecialChars%3E%3DThisIs42%21' 

Выход:

array 
    'BUTTONSOURCE[18]' => string 'AngellEYE_PHPClass' (length=18) 
    'VERBOSITY[4]' => string 'HIGH' (length=4) 
    'ParamNoLength' => string 'PlainTextIsItAnArray' (length=20) 
    'ParamNoLengthUrlEncoded' => string 'EncodedTextIsItAnArray' (length=22) 
    '<Param42_URLEncodedWithSpecialChars>' => string 'ThisIs42!' (length=9) 
+0

hmmm..that похоже, что это дает мне то же самое, что я уже получаю, но тогда вы просто вытаскиваете каждую часть и форматируете выход по-другому .. ?? Мне нужен выходной формат, точно так же, как я показал его. –

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