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

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

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

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

Q&A

3回答

1134閲覧

PHPの配列「array();」に変数を差し込む方法が知りたい

TESTON

総合スコア0

PHP

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

0グッド

1クリップ

投稿2021/07/25 06:08

編集2021/07/26 05:11

前提・実現したいこと

PHPの勉強をしていてarrayがうまく使えず困っています。。PHPの配列にDBから取り出した値(カンマで区切った複数の数字)を変数として差し込む方法が知りたいです。変数の値を正しく取得できない状況なので解決したいです。

実現したい内容はarray(1, 2, 3);の「1, 2, 3」の数字を、DBから動的に取得して差し替えたいです。配列の中身をチェックして処理を書き分けたいので以下の通り、値が含まれる場合と含まれない場合で出力を変えようと考えています。

可能なら「事前にカンマ区切りへ変換した数字の文字列にして 『array(6,11,37)』等にしたい」という意味です。

該当のソースコード

PHP

1<?php 2 //参考にしたベースのPHP 3 $check = 3; 4 $datas = array(1, 2, 3); 5 if (in_array($check, $datas)) { 6 echo "配列内に {$check} が含まれます"; 7 } else { 8 echo "配列内に {$check} は含まれません"; 9 } 10?>
配列内に 3 が含まれます

上記「1, 2, 3」に指定する文字列を、DB側から取得して「arrayの引数」にしたかったので以下を試しました。しかし「$check = 1;」「$check = 2;」「$check = 3;」どれに変更しても全パターンで「含まれない」になりました。

PHP

1<?php 2 //「1, 2, 3」のすべてが含まれなくなったPHP 3 $number = array(1, 2, 3); 4 $check = 3; 5 $datas = array($number); 6 if (in_array($check, $datas)) { 7 echo "配列内に {$check} が含まれます"; 8 } else { 9 echo "配列内に {$check} は含まれません"; 10 } 11?>
配列内に 3 は含まれません    

※「$check = 2;」や「$check = 3;」に変更しても含まれませんでした。初心者なのでミスがあるかもしれません。

試したこと

関数「implode」を使って配列をカンマ区切りの文字列に変換すると「$check = 1;」のみ含まれる状態にできましたが、なぜか「$check = 2;」や「$check = 3;」にすると含まれておらず、配列の値をチェックできず困っています。

PHP

1<?php 2 //「1」だけが含まれる状態になったPHP 3 $number = array(1, 2, 3); 4 $result = implode(',', $number); 5 $check = 3; 6 $datas = array($result); 7 if (in_array($check, $datas)) { 8 echo "配列内に {$check} が含まれます"; 9 } else { 10 echo "配列内に {$check} は含まれません"; 11 } 12?>
配列内に 3 は含まれません

もし「$check = 1;」に変更すると含まれる状態になります。

配列内に 1 が含まれます

補足情報

なぜ「1のみ含まれるのか?」は調べ中です。

参考として「echo $result;」では「1,2,3」と出力できました。しかし「var_export($result);」だと「'1,2,3'」 と両端にシングルクオーテーション付きで出力されるので変数自体の中身が怪しいなと考えています。もし仮に「array(echo $result);」と書くことができれば動くような気もしています。文法エラーなので書けませんが・・・

初心者なので疑う部分をわかっていないところもありますが、変数はそのまま引数に使うと(echoしないのであれば)両端にシングルクオーテーションが付いて、処理の邪魔をするのでしょうか?

他にどういった解決方法がありますか?もし何かよいアイデアがあれば教えていただければ幸いです。

追記情報

SQLと言っていいのかわかりませんが、以下の方法で保存しています。

PHP

1 <?php 2 add_option('select'); 3 update_option('select', $_POST['select']); 4 $output = get_option('select'); 5 var_export($output); 6 ?> 7 <select name="select[]" multiple="multiple"> 8 <option value="0">エッセイ</option> 9 <option value="1">ファンタジー</option> 10 <option value="2">ノンフィクション</option> 11 <option value="3">歴史小説</option> 12 <option value="4">短編小説</option> 13 <option value="5">図鑑</option> 14 </select>

たとえば「エッセイ」と「図鑑」を選んで保存すると「var_export($output);」で以下が出力されます。

array ( 0 => '0', 1 => '5', )

保存後にDBの「option_name」の「select」と同じ列(テーブル?)にある「option_value」という値をチェックしたら「a:2:{i:0;s:1:"0";i:1;s:1:"5";}」が入っていました。調べてみたらシリアライズ化された値とのことでした。

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

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

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

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

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

guest

回答3

0

DB側

DBでどのように保存しているかによります
きちんと正規化していればカンマ区切りの文字で保持されることはないでしょう
またDBによってはPHPの配列をJSON型などで保持することも可能です。

投稿2021/07/26 02:46

yambejp

総合スコア115010

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

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

TESTON

2021/07/26 05:03 編集

DB内でどういった状態で値が保存されているかが大切なんですね! まだデータベースをそこまで理解できていませんが、調べてみたらシリアライズされた配列が格納されていました。質問内の「追記情報」に補足を記述してみましたが参考になりますでしょうか?
guest

0

データベースから取り出した値(カンマで区切った複数の数字)

これが
データ上
1, 2, 3という「文字列」になっているのでしたら、取得した情報そのままexplode()するだけで良いと思います。

php

1<?php 2$numbers = "1, 2, 3"; 3$result = explode(',', $numbers); 4var_export($result); 5/** 6array ( 7 0 => '1', 8 1 => ' 2', 9 2 => ' 3', 10) 11**/

でも「半角スペースがあるかないか」で情報としては変わってくるので、そこは「どういう形でDBに登録されているか」は確実にしてください。
場合によってはtrimしたほうが良いです。

投稿2021/07/25 08:44

編集2021/07/25 08:46
m.ts10806

総合スコア80861

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

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

TESTON

2021/07/25 10:07

データベースの値は「array型」となっていたので、implodeで「string型」へ置き換えてから array($result);に差し込んでいましたが、この点がどうもうまく動かない原因っぽいですね。 当処理ではデータベースの値(array型)をstring型の「1,2,3」(半角なし)に変換していたので 変換後の「1,2,3」を「explode」してみましたが、当方の望む状態へは改善しませんでした。 値の取り扱い方ってむずかしいですね。var_exportを教えていただきありがとうございます!
m.ts10806

2021/07/25 10:55

テーブル定義をCREATE TABLEで、あとDBから取得時のコードも提示してください。
m.ts10806

2021/07/25 11:50

あと私の回答で違うなら「当方の望む状態」が見ている人に伝わっていないのだと思います(それか、思ってたのと違う情報が入っているか) やはり定義とコードは必要ですね。「例」ではこれ以上他者には難しいです。
TESTON

2021/07/25 11:56

ご丁寧にありがとうございます!コードや定義を伝えるのってむずかしいですね。 まだまだ勉強中の身なので理解力も低く申し訳ございません。。頑張ってみます。 取得したデータの状態をちゃんと確かめながら、explodeすればいけるとのアドバイスを元に データをダンプしながら値の状況を確認しつつ何度もexplodeを試してみますm(_ _)m
m.ts10806

2021/07/25 12:36

>コードや定義を伝えるのって コードは現状そのまま 定義はテーブル定義なのでCREATE TABLE文(SQL)をそのまま提示すれば良いです。
m.ts10806

2021/07/25 12:36

質問は編集できます。
TESTON

2021/07/26 05:03 編集

編集できるんですね!ボタンに気づきませんでした。。。補足情報などを足してみましたm(_ _)m
guest

0

データベースから取り出した値(カンマで区切った複数の数字)

それは配列ですか?
それともカンマ区切りの文字列ですか?

$number = array(1, 2, 3);

これは配列を作っていることになり、

$datas = array($number);

これはその配列を最初の要素とする二次元配列を作っていることになります。

投稿2021/07/25 06:17

itagagaki

総合スコア8402

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

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

TESTON

2021/07/25 09:45

的確なご回答ありがとうございます! > それは配列ですか? データベースから取り出した値をそのままechoで出力すると 「Array to string conversion in」のエラーが表示されるため 配列だと思い込んでいましたが違う可能性もあるんですね。 echoでエラーを出さず、配列なのかどうかを確認する方法はありますでしょうか? > それともカンマ区切りの文字列ですか? データベースの値が配列なのかどうかわからないまま、 すっかり配列だと思い込んで処理を書いていました。 当処理では「配列と思われる値」をimplodeで「カンマ区切りの文字列」へ置き換えて arrayの引数として差し込んでいるのですが、この点が間違っているということですね。 > array(1, 2, 3); 上記の「1, 2, 3」と同じ状態の文字列(カンマ区切りの文字列)にして 変数で当て込めば良いのかと思っていました・・・m(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問