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

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

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

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

Q&A

解決済

2回答

1508閲覧

同じ値の配列を、それぞれ違う値に順番に置換したい

lossless

総合スコア11

PHP

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

0グッド

0クリップ

投稿2019/06/22 05:38

編集2019/06/22 05:52

実現したいこと

WordPressの記事本文中に出てくる特定の同じカスタム要素(記事毎に要素数は変わり、4つ〜8つぐらい)を、それぞれ順番に違う要素に置換したいです。

置換元の配列と置換後の配列を用意し str_replace すると、置換元の値が同じなために実現したい結果が得られず、悪戦苦闘しております。。

もし良い解決方法があればご教授いただけないでしょうか?

発生している問題

以下のようなコードを書いて、

$search_array = ['hoge', 'hoge', 'hoge', 'hoge']; $replace_array = ['piyo1', 'piyo2', 'piyo3', 'piyo4']; $subject = "Hello hoge, My name is hoge, Are you hoge?, I'm fine hoge!"; echo str_replace($search_array, $replace_array, $subject);

私が実現したい事は、下記の結果なのですが、

Hello piyo1, My name is piyo2, Are you piyo3?, I'm fine piyo4!

公式のドキュメントにもあります「※str_replace() は左から右へと置換を行うので、 複数の置換を行うときには、前に追加された値を置換する可能性もあります。」や、
https://www.php.net/manual/ja/function.str-replace.php

以下のブログでご紹介されております通り、
https://php-archive.net/php/php-str-replace/
https://norm-nois.com/blog/archives/4088

結果は下記のように「 piyo1 」だけで置換されてしまいます。

Hello piyo1 , My name is piyo1, Are you piyo1, I'm fine piyo1!

どうしたら実現したい事が結果が得られるでしょうか?
お手数おかけいたしますが、よろしくお願いいたします。

試したこと

  • strtr を用いて連想配列を作り、置換を行おうと思ったが、key名が同じになってしまうので断念

補足情報

  • PHP7.1.18

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

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

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

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

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

guest

回答2

0

fumito_94さんのがいいと思いますが、
むりやりやるとしたら…

php

1$replace_array = ['piyo1', 'piyo2', 'piyo3', 'piyo4', '']; 2$subject = "Hello hoge, My name is hoge, Are you hoge?, I'm fine hoge!"; 3 4$ar = explode('hoge', $subject); 5$result = ''; 6for ($i=0; $i<count($ar); $i++) { 7 $result .= $ar[$i] . $replace_array[$i]; 8} 9echo $result;

投稿2019/06/22 07:30

takasima20

総合スコア7458

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

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

lossless

2019/06/22 07:57

ご回答ありがとうございます! なるほど、一度explodeで区切って代入し直すのですね。 別案もご教授下さりありがとうございます!
guest

0

ベストアンサー

結果としてはやりたいことをできると思うのですが、下記はいかがでしょうか?
preg_replaceが変更する数を引数で指定できるので結果としては毎回一つだけ変更するようになります。

php

1$search_array = ['hoge', 'hoge', 'hoge', 'hoge']; 2$replace_array = ['piyo1', 'piyo2', 'piyo3', 'piyo4']; 3$subject = "Hello hoge, My name is hoge, Are you hoge?, I'm fine hoge!"; 4 5foreach ($replace_array as $index => $value) { 6 $subject = preg_replace('/' . $search_array[$index] . '/', $value, $subject, 1); 7} 8 9> Hello piyo1, My name is piyo2, Are you piyo3?, I'm fine piyo4!

投稿2019/06/22 05:55

fumito_94

総合スコア679

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

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

lossless

2019/06/22 07:59 編集

早速のご回答誠にありがとうございます!実現出来ました! > 変更する数を引数で指定できるので結果としては毎回一つだけ変更する preg_replaceのそちら存じませんでした。。ありがとうございます! ~ちなみに「順番に置き換える」他の方法もあったりするのでしょうか?~ ※追記: takasima20さんの方法を確認させていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問