現在PHP勉強中の者です。
何度試してみても上手い解決方法が見付からなかった為、質問をさせてください。
【目標・実現したい事】
「記事のタイトル文」に対して
自動的に「記事タグ」を作成していき、
作成した記事タグをmysqlを使ってデータベースへ保存します。
そしてHTMLにてmysqlから記事タグを呼び出して表示したいです。
(1つの記事に対して記事タグの上限は9個)
例:
記事タイトル:【経済】マツキヨが3位転落イオン系のウエルシアと、ツルハドラッグに抜かれるドラッグストア「戦国時代」の行方
記事タグ:マツキヨ イオン ウエルシア ツルハドラッグ ドラッグストア 戦国時代
ネットで色々と調べてみるとyahooのAPIを利用するのが一番良さそうだという事が分かりました。
キーフレーズ抽出
https://developer.yahoo.co.jp/webapi/jlp/keyphrase/v1/extract.html
さらに詳しい利用方法とサンプルコードを掲載してくださっているサイト様が見付かりました。
http://tutty.info/262
サンプルコードを利用させて頂き、
自動的に記事タグを作成するコードを作ってみました。
PHP
1 // 記事タグの自動作成:Yahoo API-キーワード 2 $text = $title; 3 $appid = 'API IDコード'; 4 5 $url = 'http://jlp.yahooapis.jp/KeyphraseService/V1/extract'; 6 $url .= '?appid=' . $appid; 7 $url .= '&sentence=' . urlencode($text); 8 $url .= '&output=json'; 9 $result = file_get_contents($url); 10 $result_array = json_decode($result,true); 11 12 // キーワードが配列の「キー」に入っているのでarray_keys関数でキーワードを取得しています。 13 $result_array = array_keys($result_array); 14 15 //mysqlに保存する為に記事タグを1個ずつ、変数の1~9に入れています。 16 $tag1 = $result_array[0]; 17 $tag2 = $result_array[1]; 18 $tag3 = $result_array[2]; 19 $tag4 = $result_array[3]; 20 $tag5 = $result_array[4]; 21 $tag6 = $result_array[5]; 22 $tag7 = $result_array[6]; 23 $tag8 = $result_array[7]; 24 $tag9 = $result_array[8]; 25
上記のコードをforeachで回しながらmysqlに記事タグを保存してみた所、
「PHP Notice: Undefined offset」というエラーが表示されました。
【対処した方法】
ネットで検索した所、原因が「配列で存在しない位置のインデックスを参照したときに発生します。」とありました。
そこで問題は「記事のタイトル文」によっては「9個」も記事タグが出来ない事があるからでは?と思い
$tag1 = $result_array[0];
$tag2 = $result_array[1];
こちらの2個だけで試しにforeachを回してmysqlに保存を試してみた所、
正常に記事タグが2個保存されているのを確認出来ました。
これで原因が「記事タグ」が9個未満の時の「配列の空の部分」の解決方法だという事が分かったのですが
ここからが上手い解決方法を思いつく事が出来ませんでした。
最悪、foreachで回している時に$tag1から$tag9までを配列の中身があるのかどうかを
if文でisset関数で1個1個すべて判定して
中身が空だったら特定の文字を入れていって
HTMLでは特定の文字が入っていたら非表示にしていくという、
処理的にも長くて、無駄が多そうな方法しか考え付きませんでした。
$tag1 = $result_array[0]; if(!isset($tag1)){ $tag1 = "記事タグありません。"; } $tag2 = $result_array[1]; if(!isset($tag2)){ $tag2 = "記事タグありません。"; } $tag3 = $result_array[2]; if(!isset($tag3)){ $tag3 = "記事タグありません。"; } $tag4 = $result_array[3]; if(!isset($tag4)){ $tag4 = "記事タグありません。"; } $tag5 = $result_array[4]; if(!isset($tag5)){ $tag5 = "記事タグありません。"; } $tag6 = $result_array[5]; if(!isset($tag6)){ $tag6 = "記事タグありません。"; } $tag7 = $result_array[6]; if(!isset($tag7)){ $tag7 = "記事タグありません。"; } $tag8 = $result_array[7]; if(!isset($tag8)){ $tag8 = "記事タグありません。"; } $tag9 = $result_array[8]; if(!isset($tag9)){ $tag9 = "記事タグありません。"; }
勉強中の私でも上のコードは無駄が多すぎるように感じてしまいます。
(処理速度的にも無駄に重くなってしまいそうです。)
何かもっとすっきりと効率よく処理が出来るようなコードの書き方がありましたら教えて頂けると嬉しいです。
実際にYahooAPIを利用されていたり、記事タグの自動作成を経験されていた方や
何か良いお知恵を知っている方がいましたら、教えて頂けると嬉しいです。
どうかお願いします。
【$tag1~$tag8までの利用した内容】
$tag1~$tag8(記事のタグが入っています。)
php
1 2//配列に格納してmysqlに保存します。 3//foreach内での処理 4 $Data[] = [ 5 'title' => $title, 'url' => $url, 'coment' => $coment, 6 'tag1' => $tag1, 7 'tag2' => $tag2, 8 'tag3' => $tag3, 9 'tag4' => $tag4, 10 'tag5' => $tag5, 11 'tag6' => $tag6, 12 'tag7' => $tag7, 13 'tag8' => $tag8, 14 'tag9' => $tag9 15 ]; 16 17$sql = "insert into bbs (title, url, res, 18tag1,tag2,tag3,tag4,tag5,tag6,tag7,tag8,tag9, 19created) values (:title,:url,:res, 20:inyoumoto,:tag1,:tag2,:tag3,:tag4,:tag5,:tag6,:tag7, 21:tag8,:tag9,now())"; 22$stmt = $db->prepare($sql); 23$stmt->execute([ 24 ':title' => $title, 25 ':url' => $url, 26 ':res' => $coment, 27 ':tag1' => $tag1, 28 ':tag2' => $tag2, 29 ':tag3' => $tag3, 30 ':tag4' => $tag4, 31 ':tag5' => $tag5, 32 ':tag6' => $tag6, 33 ':tag7' => $tag7, 34 ':tag8' => $tag8, 35 ':tag9' => $tag9 36]); 37
mysqlに保存した後にhtmlにて表示を行っています。
HTML
1 2 <div class="kijitag"> 3 配列の中身が空の時にエラーが起きる問題の解決の為に 4 配列の中身が空の時には「タグ無し」という文字を変数の中に入れています。 5 if文で配列の中身が「タグ無し」以外の時にhtmlにて表示するように設定しています。 6 <?php if($mysql->tag1 !== "タグ無し") echo $mysql->tag1; ?> 7 <?php if($mysql->tag2 !== "タグ無し") echo $mysql->tag2; ?> 8 <?php if($mysql->tag3 !== "タグ無し") echo $mysql->tag3; ?> 9 <?php if($mysql->tag4 !== "タグ無し") echo $mysql->tag4; ?> 10 <?php if($mysql->tag5 !== "タグ無し") echo $mysql->tag5; ?> 11 <?php if($mysql->tag6 !== "タグ無し") echo $mysql->tag6; ?> 12 <?php if($mysql->tag7 !== "タグ無し") echo $mysql->tag7; ?> 13 <?php if($mysql->tag8 !== "タグ無し") echo $mysql->tag8; ?> 14 <?php if($mysql->tag9 !== "タグ無し") echo $mysql->tag9; ?> 15 </div>
自分で考えた配列が空だった場合の対処方法
PHP
1 if(!isset($result_array[0])){ 2 $result_array[0] = "タグ無し"; 3 } 4 if(!isset($result_array[1])){ 5 $result_array[1] = "タグ無し"; 6 } 7 if(!isset($result_array[2])){ 8 $result_array[2] = "タグ無し"; 9 } 10 if(!isset($result_array[3])){ 11 $result_array[3] = "タグ無し"; 12 } 13 if(!isset($result_array[4])){ 14 $result_array[4] = "タグ無し"; 15 } 16 if(!isset($result_array[5])){ 17 $result_array[5] = "タグ無し"; 18 } 19 if(!isset($result_array[6])){ 20 $result_array[6] = "タグ無し"; 21 } 22 if(!isset($result_array[7])){ 23 $result_array[7] = "タグ無し"; 24 } 25 if(!isset($result_array[8])){ 26 $result_array[8] = "タグ無し"; 27 } 28 $tag1 = $result_array[0]; 29 $tag2 = $result_array[1]; 30 $tag3 = $result_array[2]; 31 $tag4 = $result_array[3]; 32 $tag5 = $result_array[4]; 33 $tag6 = $result_array[5]; 34 $tag7 = $result_array[6]; 35 $tag8 = $result_array[7]; 36 $tag9 = $result_array[8];
これでエラーが表示される事なく記事タグをmysqlで保存できて
html上でも表示する事が出来たのですが
私のような初心者から見ても
無駄な書き方が多かったり、処理も無駄に多くなっていそうな気がします。
(ただ、今の私の実力ではこの書き方以外の方法がまったく思いつきませんでした。)
もっと良い書き方がありましたら教えて頂けると嬉しいです。
回答2件
あなたの回答
tips
プレビュー