-1

この質問に対する答えは、可能な方向を示してくれましたが、文字列を一度処理してから、結果をループします。1つのプロセスでそれを行う方法はありますか?

私の文字列はこのようなものですが、はるかに長いです:

954_adhesives
7_air fresheners
25_albums
236_stuffed_animial
819_antenna toppers
69_appliances
47_aprons
28_armbands

アンダースコアの前の数字がキーになり、アンダースコアの後のフレーズが値になるように、改行、次にアンダースコアで分割したいと思います。

4

4 に答える 4

2

正規表現を使用して、次のようにしarray_combineます。

preg_match_all('/^([0-9]+)_(.*)$/m', $input, $matches);
$result = array_combine($matches[1], array_map('trim', $matches[2]));

サンプル出力:

array(8) {
  [954]=>
  string(9) "adhesives"
  [7]=>
  string(14) "air fresheners"
  [25]=>
  string(6) "albums"
  [236]=>
  string(15) "stuffed_animial"
  [819]=>
  string(15) "antenna toppers"
  [69]=>
  string(10) "appliances"
  [47]=>
  string(6) "aprons"
  [28]=>
  string(8) "armbands"
}

結果をキーまたは値でそれぞれソートする必要がある場合は、ksortorを使用します。arsort

于 2013-06-25T15:56:23.280 に答える
0

あなたは一行でそれを行うことができます: $result = preg_split('_|\n',$string);

これは便利なテスターです: http://www.fullonrobotchubby.co.uk/random/preg_tester/preg_tester.php

于 2013-06-25T15:55:02.617 に答える
0

編集:

後世のために、これが私の解決策です。ただし、@Niels Keurentjes の回答は、最初の数字と一致するため、より適切です。


正規表現でこれを行いたい場合は、次のようにすることができます。

preg_match_all("/^(.*?)_(.*)$/m", $content, $matches);

トリックを行う必要があります。

于 2013-06-25T15:53:05.060 に答える
0

結果を次のようなネストされた配列にしたい場合。

Array
(
    [0] => Array
        (
            [0] => 954
            [1] => adhesives
        )

    [1] => Array
        (
            [0] => 7
            [1] => air fresheners
        )

    [2] => Array
        (
            [0] => 25
            [1] => albums
        )

)

array_map次に、 eg;を使用できます。

$str =
"954_adhesives
7_air fresheners
25_albums";

$arr = array_map(
  function($s) {return explode('_', $s);},
  explode("\n", $str)
);

print_r($arr);

簡潔にするために文字列の最初の 3 行を使用しましたが、同じ関数が文字列全体で正常に機能します。

于 2013-06-25T16:10:18.220 に答える