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

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

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

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

Q&A

1回答

391閲覧

PHPのeval内での関数使用がうまくいかない

hiyokoman

総合スコア8

PHP

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

0グッド

1クリップ

投稿2018/02/17 19:59

下記のように、連想配列から[ID]が1のものを抜き出す処理を書きました。

PHP

1$dataarray = array_filter($dataarray, function($v) { 2return preg_match('/^1$/', $v['ID']); 3});

ここまで正常に動くことを確認したうえで、
return箇所にevalを使用したいと思い、下記のように書き換えたのですが、
[ID]が1のものがうまく取得出来ず、結果の配列が空になってしまいます。

どのように修正すれば良いでしょうか。

PHP

1$dataarray = array_filter($dataarray, function($v) { 2eval("return preg_match('/^1$/', $v['ID']);"); 3});

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

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

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

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

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

guest

回答1

0

まずもって、設計段階で突っ込みどころ(不必要に事態を複雑化させていること)が満載です。

  • 完全一致を判定するのにpreg_matchは不要です。(string)$v['ID'] === '1'で十分です。
  • なぜ「return箇所にevalを使用したい」のでしょうか。「eval is evil」なんて言葉もあるように、それしか手段がないような場合を除いて、evalは使うべきではありません。
  • evalの中でreturnすると、それは「evalを抜ける」という意味になるので、外側の関数はreturnしません。結果、array_filterのコールバックはどの値に対しても「返り値なし」となります。

投稿2018/02/17 22:30

maisumakun

総合スコア145183

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

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

hiyokoman

2018/02/18 01:24

回答どうもありがとうございます。説明が足りなく申し訳ございません。 (1)については、実際のソースは完全一致・部分一致・後方一致・部分一致全て使用できるようにしたいと考えております。ですが、こちらでご相談するにあたり現象の再現が可能なよりシンプルなコードに書き換えておりますため、完全一致になっています。どうしてもeval内でpreg_matchを使用したく思っております。 (2)については、あくまで個人的な利用目的のプログラムであり、evalの中身は他者から書き換えられる事も無いため、evalを使用することにしております。 (3)ソースを下記のように書き換えましたが、症状変わらずです。 eval("$kekka = preg_match('/^1$/', $v['ID']);"); return $kekka;
maisumakun

2018/02/18 05:07

「完全に固定の文字列でevalを行う」ことに全くメリットがないと思うのですが、それでも使いたい理由は何でしょうか。
hiyokoman

2018/02/18 06:17

そちらも説明足らずで申し訳ございません。 (1)に記載しました通り、問題を明確化するため現象が再現可能なよりシンプルなコードに書き換えております。実際のソースは「完全に固定の文字列」ではありません。 preg_matchの箇所は他のファイルから取得するような作りになっています。あくまで個人使用のプログラムですので、セキュリティに拘りは無い物になります。よろしくお願い致します。
hiyokoman

2018/02/18 06:23

またpreg_matchの引数の中身のみ他のファイルから取得するといった仕様にするのも構造上難しく、どうしてもこのような作りになった次第です。よろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問