【PHP】API触ったことないけどハッカソンに参加してPokeAPIをたたいてみた

# はじめに
　今回はPHPでPokeAPIをつかってポケモンの画像と名前をランダムに表示する方法を説明したいと思います。
以下がイメージしているものです。

　　　　　![PokeApiサンプル.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3554505/9936059c-1f13-b145-0002-1b0ef4284c1f.gif)
今回はページを更新するたびに全国図鑑からランダムなポケモンの画像と名前を表示するようにします。

# 触ろうと思ったきっかけ
　ハッカソンに友人と参加したときにPHPを使ったアプリを作ることになり面白要素としてPokeApiを使おうという話になり自分はAPIを触ったことがなかったので挑戦しました。

# 全体のコード
```php:pokeapi.php
<?
$randamnumber=rand(1,1025);
$urlname = "https://pokeapi.co/api/v2/pokemon-species/".$randamnumber;
$urlimage="https://pokeapi.co/api/v2/pokemon/".$randamnumber;

function pokemonapiurljson($url){
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $file = curl_exec($ch);
    curl_close($ch); 
    $file = json_decode($file);
    return $file;
}

function pokemonname($file){
    $pokemonname=$file->names[0]->name;
    return $pokemonname;
}

function pokemonimg($file){
    $official_artwork="official-artwork";
    $pokemonimage=$file->sprites->other->$official_artwork->front_default;
    return $pokemonimage;
}
$name=pokemonname(pokemonapiurljson($urlname));
$image=pokemonimg(pokemonapiurljson($urlimage));
$number=1;
?>
<img src="<?echo($image)?>">
<h1><?echo($name);?></h1>
```
# 各コード説明
```php:pokeapi.php
//1から1025の中からランダムな数字を変数に代入する
$randamnumber=rand(1,1025);

//ポケモンの日本語名を取得するためのurl
$urlname = "https://pokeapi.co/api/v2/pokemon-species/".$randamnumber;

//ポケモンの画像を取得するためのurl
$urlimage="https://pokeapi.co/api/v2/pokemon/".$randamnumber;
```
ポケモンAPIはURLに全国図鑑と対応したNo.をいれることでそのポケモンに対応した情報を得ることができます。
試しに[PokeApiの公式ページ](https://pokeapi.co/)で入力欄に「pokemon/25」と打ってみるとpikachuと帰ってくると思います。これはピカチュウの全国図鑑が25であるためです。

子供のころゲームで遊んでいたときは全国図鑑の番号とか気にしていなかったのですがPokeApiの使い方を学習してからは「１＝フシギダネ、２５＝ピカチュウ」などの対応は覚えました笑

---------------------

```php:pokeapi.php
function pokemonapiurljson($url){
    //セッションの初期化
    $ch = curl_init(); 
    
    //URLとオプションを指定する
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    //https通信に対応するための指定
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    //URL情報を取得
    $file = curl_exec($ch);

    //セッションを終了
    curl_close($ch); 

    //取得したURL情報をjson形式に変換
    $file = json_decode($file);
    return $file;
}
```
phpで外部サイトにアクセスする際にはcURL関数を使うことでアクセスすることができます。上の関数では引数にAPIのURL、戻り値に取得したデータのjson形式を返しています。


```php
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
```
ここの処理は書かないといけないもの程度で覚えても良いと思います。詳しく知りたい方は以下の参考記事が役に立つと思います。

[CURL参考記事1](https://qiita.com/wanwanland/items/a5f9574fadd214d7b5c8)


--------------

```php:pokeapi.php
function pokemonname($file){
    $pokemonname=$file->names[0]->name;
    return $pokemonname;
}
```
`pokemonapiurljson()`関数で取得したデータのjsonファイルを引数に想定しています。phpではjsonファイルはオブジェクト型として取得しています。そのため`$pokemonname=$file->names[0]->name;`のような記述の仕方で取得します。

[PokeApiの公式ページ](https://pokeapi.co/)で入力欄に「pokemon-species/25」と打ってみるとnamesと書かれたタブの0番目に「ピカチュウ」と、ポケモンの日本語名が書かれていると思います。今回は日本語名を取得したいためここから情報を引き出します。

詳しく見るとnamesのキーの0番目のnameキーで取得できるため上のような記述をしています。
[PokeApiの公式ページ](https://pokeapi.co/)では「Resource for＊＊＊」の下のコードの下にある　View raw JSONにチェックを入れるとjsonファイル形式でも見ることができるのでわかりにくい人はこちらで確認するのも良いと思います。
（phpでもfunction関数のpokemonapiurljson($url)の返り値をvar_dump()で確認すると同じコードが見にくいですが確認できると思います）

私は最初チェックを入れずキーが0だと勘違いし`$pokemonname=$file->names->0->name;`と書いていました笑（`var_dump()`で確認して違うことに気が付きました）


----------
[CURL参考記事2](https://appdev-room.com/php-json)
```php:pokeapi.php
function pokemonimg($file){
    $official_artwork="official-artwork";
    $pokemonimage=$file->sprites->other->$official_artwork->front_default;
    return $pokemonimage;
}
```
先ほどと同じように引数には`pokemonapiurljson()`関数で取得したオブジェクト型のjsonファイルを想定しています。
本来であれば`$pokemonimage=$file->sprites->other->official-artwork->front_default;`と書きたかったのですが`official-artwork`と書くとエラーになってしまったので変数に格納して指定しています。

spritesキーの中には画像データに関する情報が入っています。そのため`official-artwork`キー以外でキーを指定すると別の画像を取ってくることができるので良ければ試してみてください。

-------
```php:pokeapi.php
$name=pokemonname(pokemonapiurljson($urlname));
$image=pokemonimg(pokemonapiurljson($urlimage));
```
関数を呼び出してポケモンの日本語名、画像を変数に入れています。

# まとめ
今回APIを初めて触りましたがたたき方を知ることができれば誰でも利用できるのはとても便利だと思いました。