2017-08-05 9 views
0

文字列値内で配列構文を使用し、その変数をarray()に追加したいとします。配列のような文字列を連想配列に変換するには?

同様:

$value= "'user_type'=>'test','username'=>'test'"; 
$form_data = array($value); 

希望の割り当ては次のようになります。

$form_data = array('user_type'=>'test','username'=>'test'); 

が、これは私が得るものではありません。

+3

[文字列を連想配列PHPに変換]の複製があります(https://stackoverflow.com/questions/20569829/convert-string-to-associative-array-php) – Spectarion

+0

上記のデュープリンクは正当なものですが、区切りカンマの周りにオプションのスペースがないため、これはちょっと異なる雪片です。私が二重投票/フラグをサポートしている間、私は、この質問のサンプル入力のより予測可能な形式のために独自に設計された回答を投稿することに決めました。 – mickmackusa

答えて

1

私はJSON変換を使用します。これは動作するはずです:

// create a JSON string like: 
$value = '{ "user_type":"test", "username":"test" }'; 
$form_data = json_decode($value, true); 
// test it 
var_dump($form_data); 
+0

いいえ、私は配列で使用する必要があります – Obaid

+0

あなたの答えから省略されている(プログラム上の) "準備魔法"を含めてください。 – mickmackusa

+0

ありがとうございます.. – Obaid

0

これはparse_str()を用いる方法である - 直感的な、ループのないワンライナーです。それは私にとって最善の選択のようです - 私はこれが機能の目的であることを意味します!この作業のための堅牢なソリューションと同様に、慎重な準備が必要です。

コード:(Demo

$value= "'user_type'=>'test1','username'=>'test2','monkey\'s wrench'=>'that\'s trouble'"; 
parse_str(stripslashes(str_replace(["'=>'","','"],['=','&'],trim($value,"'"))),$form_data); // second param is output variable 
var_export($form_data); 

あなたの "キー" または "の値が" 区切り部分文字列が含まれていない限り、これは、あなたによく機能します。

  • まず、先頭と末尾の単一引用符が
  • 切り落とされその後str_replace()は、区切り文字を変更します:
    • '=>'=
    • ','&
  • なりなりその後stripslashes()は、いずれかを処理しますスラッシュをエスケープします。
  • 最後に、parse_str()は、その魔法を使って連想配列を直接生成します。

私の方法は機能しませんすぐに理由(string)プレフィックスと区切りのカンマの周りの任意の間隔の問題の重複リンク上。私の方法は、厳密に構造化された1次元の連想配列のような文字列に特に適しています。

注意深く設計されたパターンとpreg_match()を用いる方法が信頼できるかもしれないが、正規表現は、文字列関数より断定遅く、素人目に少し入り組ん現れ得ます。

eval()を使用する方法も可能ですが、その機能は他のすべてがうまく機能しない場合にのみ「プランZ」として使用する必要があります。また、値を厳重に妥協する必要があります。

explode()foreach()ループを使用する方法では、より大きなコードブロックが必要となりますが、私はそれがより遅い代替(ただし、そうでないかもしれない)と仮定します。任意の1文字で爆発すると、データのマングリングのリスクが高くなります。すべてのソリューションと同様に、データの不確実性を維持することに特に注意が必要です。

verjasの方法は論理的なアプローチのようですが、一重引用符を二重引用符で置き換えると、引用符を含むキーと値が混乱する可能性があります。一重引用符と二重引用符に対応するために、準備コードをverjasに残します。

関連する問題