3

私のデータベースでは、いくつかのフィールド設定がシリアル化されて保存されています。私がこれを行うとき:

print_r(unserialized($r['settings']));

これを入手します。ここは私が払うわ:

Array ( 
[prefix] => 
[suffix] => 
[min] => 
[max] => 
[allowed_values] => 1|Common 2|Rare 3|Almost Extinct 
)

次のように、allowed_values の値に基づいて配列を作成しようとしています。

Array (
[1] => Common
[2] => Rare
[3] => Almost Extinct
)

問題は、explode("|", $r['allowed_values']) を使用すると、次のようになることです。

Array(
[0] => 1
[1] => Common 2
[2] => Rare 3
[3] => Almost Extinct
)

これは理にかなっていますが、明らかに私が望んでいたものではありません...だから、私がここで試していることを行う簡単な方法があるかどうか疑問に思っていますか? スペースに1回、パイプに1回、複数回爆発を使用することを考えましたが、「ほぼ絶滅」のスペースのためにそれも機能しません...

4

4 に答える 4

3

これを試して:

 $tab=array();
 preg_match_all("/\s*(\d+)\|([^\d]+)/",$r['allowed_values'],$tab);
 print_r(array_combine($tab[1],$tab[2]));

これでうまくいくはずです:)

于 2010-07-01T15:44:56.420 に答える
2

元のインデックスが 1 からシーケンシャルではなく、それらをそのままにしておく必要がある場合は、インデックスと値が正しくバインドされたままになるため、dweeves の回答を参照してください。

$string = unserialized($r['settings']['allowed_values']);
//$string = '1|Common 2|Rare 3|Almost Extinct';

print_r (preg_split("/\d+\|/", $string, -1, PREG_SPLIT_NO_EMPTY));

出力:

Array
(
    [0] => Common 
    [1] => Rare 
    [2] => Almost Extinct
)
于 2010-07-01T15:46:33.190 に答える
0

これはうまくいくはずだと思います。これにより、最初の数字と「|」が分割されます。チャー

<?php
$string = "1|Faruk 2|Test";
$array = preg_split('/\d/', $string, -1, PREG_SPLIT_NO_EMPTY); 
$content = explode("|", implode($array));

var_dump($content);
?>

そして、ここに結果があります

array(3) {
  [0]=>
  string(0) ""
  [1]=>
  string(6) "Faruk "
  [2]=>
  string(4) "Test"
}
于 2010-07-01T15:38:15.943 に答える
0

正規表現を使用して各エントリのパターンを照合しますが、対象のテキストのみをキャプチャします。を使用しpreg_match_all(...)て、$matchオブジェクトにキャプチャ グループのサブ配列が入力されます。

$input = '1|Common 2|Rare 3|Almost Extinct';
preg_match_all('/\d+\|([^\d]+)/',$input, $match);
print_r($match[1]);

プロデュース:

Array
(
    [0] => Common 
    [1] => Rare 
    [2] => Almost Extinct    
)

ラベルに数字を使用する場合は、正規表現を微調整する必要があることに注意してください。

この方法では、テーブルに格納されている値が順不同である可能性がある場合に、数値をキャプチャして独自の順序付き配列を作成することもできます。

于 2010-07-01T15:59:46.900 に答える