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

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

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

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

Q&A

解決済

2回答

938閲覧

[1,2,3] を 1,2,3 という整数型に変換した状態で、関数に渡す方法

marusankakun

総合スコア16

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

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

0グッド

0クリップ

投稿2020/02/18 08:58

###前提・実現したいこと
$array = [ 1, 2 ];という不定数の配列があるとき、以下のように関数prepare()1,2という「整数のカンマ区切り」で渡したいです。

php

1prepare( 1, 2 ); // こう渡したい 2prepare( '1, 2' ); // こうではない 3prepare( '1', '2' ); // こうではない

###発生している問題
WordPressでレコードを取得するとき、文字列なら問題なく%sprepare()で置換できますよね。

php

1$array = [ 'nameA', 'nameB' ]; 2$values = implode( ',', $array ); 3$sql = "SELECT * FROM wp_test WHERE col_str_1 = %s and col_str_2 = %s"; 4$rows = $wpdb->get_results( $wpdb->prepare( $sql, $values ) );

では文字列でなく整数のとき、同じようにprepare()を使って取得するにはどうすればいいのでしょうか?

例えば以下ですと、prepare()に入る$valuesimplode()で文字列になってしまうため取得できません。

php

1$array = [ 1, 2 ]; 2$values = implode( ',', $array ); 3$sql = "SELECT * FROM wp_test WHERE col_int_1 = %d and col_int_2 = %d"; 4$rows = $wpdb->get_results( $wpdb->prepare( $sql, $values ) );

つまり上記ではこのように渡されてしまいます。

php

1$rows = $wpdb->get_results( $wpdb->prepare( $sql, '1, 2' ) );

なんとか次の状態でprepare()に渡さなければならないわけで、どうすればいいのか戸惑っています。

php

1$rows = $wpdb->get_results( $wpdb->prepare( $sql, 1, 2 ) );

###試したこと
悪あがきですが1つずつintval()を通してみたりしたのですが...

php

1$array = [ 1, 2 ]; 2$str = implode( ',', $array ); 3$result = ''; 4foreach ( explode(',',$str) as $val ){ 5 $result .= intval($val) . ','; 6} 7$result = rtrim($result,','); 8var_dump($result);

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

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

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

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

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

guest

回答2

0

PHP

1function test(){ 2 print_r(func_get_args()); 3} 4call_user_func_array("test",[1,2,3]); 5test(1,2,3);

投稿2020/02/18 09:02

yambejp

総合スコア116724

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

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

marusankakun

2020/02/18 09:11

ありがとうございます。そちら結果として整数ですが配列で得られるようです。しかしそれをどうやって $rows = $wpdb->get_results( $wpdb->prepare( $sql, $values ) ); の$valuesに、整数のカンマ区切りで渡すか、というのがわからないのですが。 目的は「配列」ではなくて「整数のカンマ区切り」というのが厄介なところです。
yambejp

2020/02/18 09:25 編集

クラスからの処理は配列でクラスを指定します <?PHP class test{ function prepare(){ print_r(func_get_args()); } } $test=new test; $sql="select * from hogehoge"; $values=[1,2,3]; $params=array_merge([$sql],$values); call_user_func_array([$test,"prepare"],$params);
marusankakun

2020/02/18 09:28

すみません初見でかなりきついのですが、どういうことか全体で教えて頂けませんでしょうか。こうではないですよね。 $array = [ 1, 2 ]; $sql = "SELECT * FROM wp_test WHERE col_int_1 = %d and col_int_2 = %d"; $params=array_merge([$sql],$values); $rows = call_user_func_array([$wpdb, 'prepare'],$params);
yambejp

2020/02/18 09:35

$rows = $wpdb->get_results( call_user_func_array([$wpdb, 'prepare'],$params)) じゃないですかね? 環境がないので検証はできませんが
marusankakun

2020/02/18 09:58

get_results()の中で実行でしたか。お見事です。ありがとうございます。お手数おかけしました。
guest

0

ベストアンサー

投稿2020/02/18 09:01

編集2020/02/18 09:06
papinianus

総合スコア12705

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

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

marusankakun

2020/02/18 09:21

よくわからないまま結局文字列に...w $array = [ 1, 2 ]; function test(int $a, int $b) { return "$a , $b"; } test(...$array); $values = test(...$array); $sql = "SELECT * FROM wp_test WHERE col_int_1 = %d and col_int_2 = %d"; $rows = $wpdb->get_results( $wpdb->prepare( $sql, $values ) ); どのように使えばよろしいのでしょうか? あと今回$arrayは不定数ですが、それでもできますか?
marusankakun

2020/02/18 09:45

ご回答編集ありがとうございます。 次のようなイメージ、でしょうか? function f($sql, ...$params) { prepare('$sql, $params); } $array = [ 1, 2 ]; $sql = "SELECT * FROM wp_test WHERE col_int_1 = %d and col_int_2 = %d"; $rows = $wpdb->get_results( $wpdb->f( $sql, $array ) ); 「prepare」はリンク先の例にあるように「f」の中で実行し、「array」は全て「...」で渡してやれば、不定の「$array」の値が、そのまま整数なら整数で「preapre」に渡せるのか?と踏んだのですが。
papinianus

2020/02/18 09:49

一つ前のコメントで $rows = $wpdb->get_results( $wpdb->prepare( $sql, ...$array ) ); で良いと思いますが、WordPress持ってないので確認できません。testとかfとかは不要な気がします
marusankakun

2020/02/18 09:57

できました。感動しました。簡単にできるので重宝しそうです。どうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問