質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

395閲覧

ループで正規表現の構築(whileを使いたい)

SugiuraY

総合スコア317

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/06/29 00:29

編集2018/06/29 00:51

文字列を部検索するために、forループを使用してpatternを作成しようとしております。
$hogeがスタートで$fugaがゴールです。ループさせて文字列を順番に配列に格納してそれぞれ
順番に"."に置き換えて新たに格納する方法を
採りたいと考えております。(ループ+substr_replaceを使えば簡単にできることは存じ上げておりますが
ループで各文字列を順番に取得して、それぞれを置き換えて再格納する方法で実現する方法勉強しているということでご理解ください。)

アドバイスの程、宜しくお願いいたします。

php

1//PHP ver 7.0.9 2$hoge=array("山田太郎","ロベルトカルロス");//要素数はunknown 3for ($i=0;$i<count($hoge);$i++){ 4 for ($k=0; $k<strlen($hoge($i));$k++){ 5 $piyo[]=$substr(hoge($i),$k,1);// $piyo=("山","田","太","郎") 6 } 7} 8//ここまではなんとなくですが思いつくのですが、 9//$piyo=array("山","田","太","郎")をループさせて$fugaにするアイデアが思いつきません。。。 10 11$fuga=array(array(".田太郎|山.太郎|山田.郎|山田太."), 12array(".ベルトカルロス|ロ.ルトカルロス|ロベ.トカルロス|ロベル.カルロス|ロベルト.ルロス|ロベルトカ.ロス|ロベルトカル.ス|ロベルトカルロ.")); 13

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/06/29 00:38

PHPのバージョンは幾つでしょうか。 そもそも冒頭の ("山田太郎","ロベルトカルロス"); の時点でSyntaxError出てますが。
SugiuraY

2018/06/29 00:42

コメント有難うございます。細かいコードの記載を割愛しておりましたので修正しました。またverも加筆します。
m.ts10806

2018/06/29 00:49

最後も配列ですよね。正しくない結果やコードの提示は回答のための弊害にしかなりませんのでお気を付けください。
SugiuraY

2018/06/29 00:51

大変失礼いたしました、留意いたします。
SugiuraY

2018/06/29 00:51

大変失礼いたしました、留意いたします。
guest

回答1

0

ベストアンサー

要件をまとめると

  • 要素数は不定でそれぞれの要素数の文字数も不定
  • それぞれの要素の文字列にそれぞれ「任意の文字1文字」の正規表現.を入れていく
  • |でつないで、1つの配列とする

foreachで要素数分ループし、forを2回重ねてそれぞれ入れていけば良いと思います。

例:

php

1<?php 2$hoge = ["山田太郎","ロベルトカルロス"]; 3$piyo = []; 4foreach($hoge as $word){ 5 $cnt = mb_strlen($word); 6 $word_arr = []; 7 $word_reg_cnt = 0; 8 for($i=0;$i<$cnt;$i++){ 9 $word_reg = ""; 10 for($ii=0;$ii<$cnt;$ii++){ 11 if($word_reg_cnt === $ii){ 12 $word_reg .= "."; 13 }else { 14 $word_reg .= mb_substr($word,$ii,1); 15 } 16 } 17 $word_arr[] = $word_reg; 18 $word_reg_cnt++; 19 } 20 $piyo[] = implode("|",$word_arr); 21} 22 23var_dump($piyo); 24/* 出力結果 25array(2) { 26 [0]=> 27 string(43) ".田太郎|山.太郎|山田.郎|山田太." 28 [1]=> 29 string(183) ".ベルトカルロス|ロ.ルトカルロス|ロベ.トカルロス|ロベル.カルロス|ロベルト.ルロス|ロベルトカ.ロス|ロベルトカル.ス|ロベルトカルロ." 30} 31*/

投稿2018/06/29 01:08

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SugiuraY

2018/06/29 08:16

mts10806様 ご教示頂き有難うございます。 まさにif($word_reg_cnt === $ii)の発想が自分にはなかったです。。 とても助かりました。 改めて御礼申しあげます。
m.ts10806

2018/06/29 08:18

私も最初から答えを持っていたわけではないので、どうすれば実現可能か考えてあのやり方に行きつきました。 特殊なことをやろうとしても整合性とれなくなるのでシンプルに実現可能な模索するのが好きです(業務ではシンプルが一番ですし・・) 解決したようで何よりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問