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

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

ただいまの
回答率

90.45%

  • PHP

    24602questions

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

  • MySQL

    7155questions

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

  • API

    1861questions

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

  • 配列

    633questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 395

shimane

score 82

現在PHP勉強中の者です。

何度試してみても上手い解決方法が見付からなかった為、質問をさせてください。

【目標・実現したい事】

「記事のタイトル文」に対して
自動的に「記事タグ」を作成していき、
作成した記事タグをmysqlを使ってデータベースへ保存します。
そしてHTMLにてmysqlから記事タグを呼び出して表示したいです。
(1つの記事に対して記事タグの上限は9個)

例:
記事タイトル:【経済】マツキヨが3位転落イオン系のウエルシアと、ツルハドラッグに抜かれるドラッグストア「戦国時代」の行方
記事タグ:マツキヨ イオン ウエルシア ツルハドラッグ ドラッグストア 戦国時代


ネットで色々と調べてみるとyahooのAPIを利用するのが一番良さそうだという事が分かりました。

キーフレーズ抽出
https://developer.yahoo.co.jp/webapi/jlp/keyphrase/v1/extract.html

さらに詳しい利用方法とサンプルコードを掲載してくださっているサイト様が見付かりました。
http://tutty.info/262

サンプルコードを利用させて頂き、
自動的に記事タグを作成するコードを作ってみました。

  // 記事タグの自動作成:Yahoo API-キーワード
  $text   =  $title;
  $appid  = 'API IDコード';

  $url    = 'http://jlp.yahooapis.jp/KeyphraseService/V1/extract';
  $url   .= '?appid=' . $appid;
  $url   .= '&sentence=' . urlencode($text);
  $url   .= '&output=json';
  $result = file_get_contents($url);
  $result_array = json_decode($result,true);

 // キーワードが配列の「キー」に入っているのでarray_keys関数でキーワードを取得しています。
  $result_array = array_keys($result_array);

 //mysqlに保存する為に記事タグを1個ずつ、変数の1~9に入れています。
  $tag1 = $result_array[0];
  $tag2 = $result_array[1];
  $tag3 = $result_array[2];
  $tag4 = $result_array[3];
  $tag5 = $result_array[4];
  $tag6 = $result_array[5];
  $tag7 = $result_array[6];
  $tag8 = $result_array[7];
  $tag9 = $result_array[8];

上記のコードを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(記事のタグが入っています。)

//配列に格納してmysqlに保存します。
//foreach内での処理
  $Data[] = [
    'title' => $title, 'url' => $url, 'coment' => $coment, 
    'tag1' => $tag1,
    'tag2' => $tag2,
    'tag3' => $tag3,
    'tag4' => $tag4,
    'tag5' => $tag5,
    'tag6' => $tag6,
    'tag7' => $tag7,
    'tag8' => $tag8,
    'tag9' => $tag9
  ];

$sql = "insert into bbs (title, url, res,
tag1,tag2,tag3,tag4,tag5,tag6,tag7,tag8,tag9,
created) values (:title,:url,:res,
:inyoumoto,:tag1,:tag2,:tag3,:tag4,:tag5,:tag6,:tag7,
:tag8,:tag9,now())";
$stmt = $db->prepare($sql);
$stmt->execute([
  ':title' => $title,
  ':url' => $url,
  ':res' => $coment,
  ':tag1' => $tag1,
  ':tag2' => $tag2,
  ':tag3' => $tag3,
  ':tag4' => $tag4,
  ':tag5' => $tag5,
  ':tag6' => $tag6,
  ':tag7' => $tag7,
  ':tag8' => $tag8,
  ':tag9' => $tag9
]);

mysqlに保存した後にhtmlにて表示を行っています。

 <div class="kijitag">
                      配列の中身が空の時にエラーが起きる問題の解決の為に
            配列の中身が空の時には「タグ無し」という文字を変数の中に入れています。
            if文で配列の中身が「タグ無し」以外の時にhtmlにて表示するように設定しています。
                      <?php if($mysql->tag1 !== "タグ無し")  echo $mysql->tag1; ?>
                      <?php if($mysql->tag2 !== "タグ無し")  echo $mysql->tag2; ?>
                      <?php if($mysql->tag3 !== "タグ無し")  echo $mysql->tag3; ?>
                      <?php if($mysql->tag4 !== "タグ無し")  echo $mysql->tag4; ?>
                      <?php if($mysql->tag5 !== "タグ無し")  echo $mysql->tag5; ?>
                      <?php if($mysql->tag6 !== "タグ無し")  echo $mysql->tag6; ?>
                      <?php if($mysql->tag7 !== "タグ無し")  echo $mysql->tag7; ?>
                      <?php if($mysql->tag8 !== "タグ無し")  echo $mysql->tag8; ?>
                      <?php if($mysql->tag9 !== "タグ無し")  echo $mysql->tag9; ?>
                 </div>

自分で考えた配列が空だった場合の対処方法

  if(!isset($result_array[0])){
    $result_array[0] = "タグ無し";
  }
  if(!isset($result_array[1])){
    $result_array[1] = "タグ無し";
  }
  if(!isset($result_array[2])){
    $result_array[2] = "タグ無し";
  }
  if(!isset($result_array[3])){
    $result_array[3] = "タグ無し";
  }
  if(!isset($result_array[4])){
    $result_array[4] = "タグ無し";
  }
  if(!isset($result_array[5])){
    $result_array[5] = "タグ無し";
  }
  if(!isset($result_array[6])){
    $result_array[6] = "タグ無し";
  }
  if(!isset($result_array[7])){
    $result_array[7] = "タグ無し";
  }
  if(!isset($result_array[8])){
    $result_array[8] = "タグ無し";
  }
  $tag1 = $result_array[0];
  $tag2 = $result_array[1];
  $tag3 = $result_array[2];
  $tag4 = $result_array[3];
  $tag5 = $result_array[4];
  $tag6 = $result_array[5];
  $tag7 = $result_array[6];
  $tag8 = $result_array[7];
  $tag9 = $result_array[8];

これでエラーが表示される事なく記事タグをmysqlで保存できて
html上でも表示する事が出来たのですが
私のような初心者から見ても
無駄な書き方が多かったり、処理も無駄に多くなっていそうな気がします。
(ただ、今の私の実力ではこの書き方以外の方法がまったく思いつきませんでした。)

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2017/07/20 11:21

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

    キャンセル

  • shimane

    2017/07/20 12:15

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

    キャンセル

回答 2

checkベストアンサー

+2

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

// $result_array = array(1=>'タグ1',2=>'タグ2'); 2個しかない!

$tag = array();
for ($i = 0; i < 9; $i++){
  if(isset($result_array[$i])){
    $tag[$i] = $result_array[$i];
  }
  else{
    $tag[$i] = "タグ無し";
  }
}

//8まで作ったから8を触っても平気!
echo $tag[8];    //出力:タグ無し


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/20 22:49

    回答有難うございます。

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/20 09: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を使うことで問題を解決出来るような方法を教えて頂けないでしょうか?
    よろしくお願いします。

    キャンセル

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

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • PHP

    24602questions

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

  • MySQL

    7155questions

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

  • API

    1861questions

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

  • 配列

    633questions

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

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