1

2 つの preg_match() 呼び出しがあり、最初の配列を置き換えるのではなく、配列をマージしたいと考えています。これまでの私のコード:

$arr = Array();
$string1 = "Article: graphics card";
$string2 = "Price: 300 Euro";
$regex1 = "/Article[\:] (?P<article>.*)/";
$regex2 = "/Price[\:] (?P<price>[0-9]+) Euro/";

preg_match($regex1, $string1, $arr);
//output here:
$arr['article'] = "graphics card"
$arr['price'] = null
preg_match($regex2, $string2, $arr);
//output here:
$arr['article'] = null
$arr['price'] = "300"

どのように一致させることができるので、出力は次のようになります。

$arr['article'] = "graphics card"
$arr['price'] = "300"

?

4

5 に答える 5

1

これが私だったら、これを行う方法です。これにより、後日簡単に拡張できるようになり、コールバック関数の使用を避けることができます。$strs[$key]また、$strs配列を単一の文字列 var に置き換えることで、1 つの文字列の検索を簡単にサポートすることもできます。数値キーは削除されませんが、配列から連想キーにアクセスするだけであれば、問題は発生しません。

$strs = array();
$strs[] = "Article: graphics card";
$strs[] = "Price: 300 Euro";

$regs = array();
$regs[] = "/Article[\:] (?P<article>.*)/";
$regs[] = "/Price[\:] (?P<price>[0-9]+) Euro/";

$a = array();

foreach( $regs as $key => $reg ){
  if ( preg_match($reg, $strs[$key], $b) ) {
    $a += $b;
  }
}

print_r($a);

/*
Array
(
    [0] => Article: graphics card
    [article] => graphics card
    [1] => graphics card
    [price] => 300
)
*/
于 2012-10-17T08:16:54.477 に答える
1

preg_replace_callbackコールバック関数内でマージを使用および処理できます。

于 2012-10-17T07:58:07.020 に答える
0

結果を 2 つの異なる配列に格納する場合は、これにarray_mergeを使用できます。しかし、上記の出力は正しくありません。文字列に regex1 を使用して検索した場合、$arr['price'] はありませんが、$arr['article'] のみです。同じことが 2 番目の preg_match にも当てはまります。つまり、1 つの結果を $arr に格納し、1 つの結果を $arr2 に格納すると、それらを 1 つの配列にマージできます。

preg_match は機能自体を提供しません。

于 2012-10-17T07:45:02.673 に答える
0
  1. 2 番目の preg_match には別の配列を使用します。 $arr2
  2. としてトラバース$arr2$key => $valueます。
  3. $arr[$key]とから null 以外の値を選択し $arr2[$key]、その値を に書き込みます$arr[$key]
  4. $arrマージされた配列が必要になります。
于 2012-10-17T07:55:38.653 に答える
-1

これはあなたの例でうまくいくはずです:

array_merge( // selfexplanatory
           array_filter( preg_match($regex1, $string1, $arr)?$arr:array() ), //removes null values
           array_filter( preg_match($regex2, $string2, $arr)?$arr:array() ) 
  );
于 2012-10-17T07:44:18.277 に答える