人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPにて下記のような文字列置換を行うにはどのようにすればよいのでしょうか?

【変換前】
0001:1,0001:2,0001:10-15,0002:2-3,0005:1

【変換後】
0001:1,0001:2,0001:10,0001:11,0001:12,0001:13,0001:14,0001:15,0002:2,0002:3,0005:1

●質問者: harvard
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:PHP 文字列
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● GEN111
●23ポイント

こんな感じですかね。

function expand($exp) {
 $myarray = array() ;
 foreach (explode(',', $exp) as $one) {
 list($a, $b) = explode(':', $one) ;
 list($x, $y) = explode ('-', $b) ;
 do {
 array_push($myarray, "$a:$x") ;
 ++$x ;
 } while ($x <= $y) ;
 }
 return implode(',', $myarray) ;
}

$str = '0001:1,0001:2,0001:10-15,0002:2-3,0005:1' ;
echo expand($str) ;

2 ● vector
●23ポイント

処理としてはこんな感じでよいかと思います。

$arr = explode(',', $str);
$result = array();
foreach ($arr as $src) {
 list($key, $val) = explode($src, ':');
 // 一応NOTICE回避
 if (strpos('-', $val) !== fase) {
 list($start, $end) = explode('-', $val);
 for ($i = $start; $i <= $end; $i++) {
 $result[] = "{$key}:{$i}";
 }
 } else {
 $result[] = "{$key}:{$val}"
 }
}
$str = implode(',', $result);

3 ● kn1967
●22ポイント
// 展開用サブルーチン
function fn_x($a,$b,$c){
 $ret = array();
 foreach(range($b,$c) as $n) { 
 array_push($ret,"$a:$n");
 }
 return(join(",",$ret));
}
//
// 元データ
$a = "0001:1,0001:2,0001:10-15,0002:2-3,0005:1";
//
// 置換実行
echo preg_replace("/(\d+):(\d+)-(\d+)/e","fn_x('$1',$2,$3)",$a);

ポイントはe装飾子をつけて2番目の引数を展開させてやることと、後方参照時に$1の値が数値に自動変換されてしまうのを防ぐために'で囲んでおいてやることの2点。


4 ● kn1967
●22ポイント
// 展開用サブルーチン
function fn_x($a,$b,$c){ return(join(",",preg_replace("/(.+)/","$a:$1",range($b,$c)))); }
// 元データ
$a = "0001:1,0001:2,0001:10-15,0002:2-3,0005:1";
// 置換実行
echo preg_replace("/(\d+):(\d+)-(\d+)/e","fn_x('$1',$2,$3)",$a);

さらに煮詰めて短くしました。

foreachで回してた分を配列に対する一括置換に置き換えています。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ