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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1504閲覧

【PHP】【YahooキーフレーズAPI】記事タグ自動取得時の「配列の中身が空の場合」の問題解決について

shimane

総合スコア98

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2017/07/20 00:00

編集2017/07/20 03:13

現在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上でも表示する事が出来たのですが
私のような初心者から見ても
無駄な書き方が多かったり、処理も無駄に多くなっていそうな気がします。
(ただ、今の私の実力ではこの書き方以外の方法がまったく思いつきませんでした。)

もっと良い書き方がありましたら教えて頂けると嬉しいです。

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

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

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

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

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

kei344

2017/07/20 02:21

「$tag1から$tag9まで」は結局どう使用しているのかのコードが書かれていません。追記お願いします。
shimane

2017/07/20 03:15

kei344さん 質問有難うございます。 「$tag1から$tag9まで」の使用している部分について追記致しました。ご確認をお願いします。
guest

回答2

0

ベストアンサー

9個がMAXだと決まっているなら、たとえば

PHP

1// $result_array = array(1=>'タグ1',2=>'タグ2'); 2個しかない! 2 3$tag = array(); 4for ($i = 0; i < 9; $i++){ 5 if(isset($result_array[$i])){ 6 $tag[$i] = $result_array[$i]; 7 } 8 else{ 9 $tag[$i] = "タグ無し"; 10 } 11} 12 13//8まで作ったから8を触っても平気! 14echo $tag[8]; //出力:タグ無し

とかだと簡単ですかね。
他の部分は$tag1~$tag9$tag[0]~$tag[8]に置き換えるだけです。

投稿2017/07/20 06:03

編集2017/07/20 06:06
r_ym

総合スコア79

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

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

shimane

2017/07/20 13:49

回答有難うございます。 すごいスッキリとしたコードです! 素晴らしい。とっても勉強になりました、本当に有難うございます。 大感謝です!
guest

0

foreachで回しながらmysqlに記事タグを保存してみた所

foreachの使い方を知っている訳ですよね?
なぜ、$result_arrayをforeachで使わないのでしょうか?

投稿2017/07/20 00:23

yoorwm

総合スコア1305

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

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

shimane

2017/07/20 00:43

回答有難うございます。 申し訳ありません。せっかくヒントを教えて頂いたにも関わらず 私の技術力がまだそこまで到達できていません、申し訳ないです。 foreachの使い方で知っているのは 本当に基礎的なもので私が現在foreachを使っている処理は { 記事タイトルを取得 記事タグを取得 mysqlで記事タイトルと記事タグを保存 } この一連の作業となっています。 私が$result_arrayをforeachを使って出来る事は foreach($result_array as $test1) { $test2[] = $test1; } これで別の配列に入れる事(今回の記事タグ取得では意味が無いと思います。) foreach($result_array as $test1) { echo $test1; } といった簡単な事だけで $result_arrayをforeachで使う事で どうやって次の段階の「$tag1」~「$tag2」にキーワードを入れる事が出来て 「配列」が「空の場合」の対処方法も出来るのかという所までを理解する事が出来ませんでした。 技術力がまったく足りてなくて、お恥ずかしい限りなのですが もしよろしければ、foreachを使うことで問題を解決出来るような方法を教えて頂けないでしょうか? よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問