【PHP】はてなブログやQiitaなど別サービスの記事を一か所にまとめて表示する方法

# やりたいこと
はてなブログやQiitaなどの別サービスのブログ記事を日付順でまとめて一覧表示する。

※今回は、はてなブログとQiitaと個人で運営しているサイトのブログ記事の三つをまとめて表示。

# 備考
**まとめるブログ**
- はてなブログの投稿記事
- Qiitaの投稿記事
- 個人運営のブログ記事（このサイトのトップにまとめた記事を一覧表示する）

**環境**
- PHP5.6
- CakePHP3.6
- CentOS7

# 方法

**全体像**
1.それぞれのブログの記事情報を一つの配列にまとめる
2.配列内の要素を日付順でソートする
3.foreachで配列を回して一件ずつ表示

## 1.それぞれのブログの記事情報を一つの配列にまとめる
まず、はてなブログ・Qiita・個人ブログの記事情報（タイトル・投稿日とか）を一つの配列の中に入れ込んでいきます。
ここでは、記事情報を詰め込む配列を**$listBlogs**としています。

```php
//記事情報を格納する配列を用意
$listBlogs = array();

/**
 * Qiitaに投稿した記事内容を$listBlogsに格納する
 */

//rssフィードの情報を取得する
$qiitaRssUrl = 'https://qiita.com/hogehoge/feed';
$qiitaXmlObject = simplexml_load_file($qiitaRssUrl);
$qiitaBlogs = $qiitaXmlObject -> entry;

//取得したrss情報を基に必要な記事情報を$listBlogsへ格納する
foreach ($qiitaBlogs as $qiitaBlog) {
     $listBlogs[] = array(
          'title' => $qiitaBlog -> title,
          'url' => $qiitaBlog -> url,
          'date' => date('Y-m-d', strtotime($qiitaBlog -> updated))//①日付フォーマットの統一
     );
}

/**
 * はてなブログに投稿した記事内容を$listBlogsに格納する
 */

//rssフィードの情報を取得する
$hatenaRssUrl = 'https://hogehoge.hatenablog.com/rss';
$hatenaXmlObject = simplexml_load_file($hatenaRssUrl);
$hatenaBlogs = $hatenaXmlObject -> channel -> item;

//取得したrss情報を基に必要な記事情報を$listBlogsへ格納する
foreach ($hatenaBlogs as $hatenaBlog) {
     $listBlogs[] = array(
          'title' => $hatenaBlog -> title,
          'url' => $hatenaBlog -> link,
          'date' => date('Y-m-d', strtotime($hatenaBlog -> pubDate))//①日付フォーマットの統一
     );
}

/**
 * 個人ブログに投稿した記事内容を$listBlogsに格納する
 */

$blogs = $this->Hogehoge->find()->all();

foreach ($blogs as $blog) {
        $listBlogs[] = array(
            'title' => $blog -> title,
            'url' => $blog -> url,
            'date' => date('Y-m-d', strtotime($blog -> modified))//①日付フォーマットの統一
        );
}

```

QiitaとはてなブログについてはRSSフィードのXML情報から記事タイトルや記事作成日を取得しています。
RSSフィードのXML情報を取得するには**simplexml_load_file()**を使用します。
この**simplexml_load_file()**はXML情報がオブジェクトとして返ってくるので、それを基に記事タイトルなど必要な情報を抽出し**$listBLogs**へ記事単位で格納します。

```php
//RSSフィードのXML情報を取得
$rssFeedUrl = 'https://hogehogehoge.hoge'
$rssXmlInfo = simplexml_load_file($rssFeedUrl)

//例：タイトルを取得
$title = $rssXmlInfo -> title;
```

RSSフィードの取得については以下の記事を参考にしました。
[【PHP】 RSSフィードを取得して、ブログの更新情報を表示してみる。](https://senews.jp/2017/10/23/%E3%80%90php%E3%80%91-rss%E3%83%95%E3%82%A3%E3%83%BC%E3%83%89%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E3%81%A6%E3%80%81%E3%83%96%E3%83%AD%E3%82%B0%E3%81%AE%E6%9B%B4%E6%96%B0%E6%83%85%E5%A0%B1%E3%82%92/)

コード内の①の部分はこの後日付順で記事をソートする際にフォーマットがバラバラだと上手くいかないので、フォーマットを統一するための記述です。

日付のフォーマットを変更するには、**date()**と**strtotime()**を組み合わせて使用しています。
こちらについては以下の記事を参考にしました。
[php：phpのdate関数で日付のフォーマット変更](http://raining.bear-life.com/php/php%E3%81%AEdate%E9%96%A2%E6%95%B0%E3%81%A7%E6%97%A5%E4%BB%98%E3%81%AE%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E5%A4%89%E6%9B%B4)

## 2.配列内の要素を日付順でソートする
1.でそれぞれのサービスの記事情報が記事単位で一つの配列に格納されたので、格納された記事を日付順でソートします。
（ソート前は、Qiita→はてなブログ→個人ブログの順に並んでいます）

```php

/**
 * 配列$listBlogs内の要素を日付順でソート
 */

//配列の各要素からソートの基準となる値のみを抽出し、別の配列に格納する
$date_array = array();

foreach( $listBlogs as $listBlog ) {
     $date_array[] = $listBlog['date'];
}

//ソートの実施
array_multisort( $date_array, SORT_DESC, $listBlogs);

```

記事の情報が格納された**$listBlogs**は以下のような構造を持つ多次元配列となっています。

- $listBlogs
    - 記事1
        - 記事タイトル
        - 記事のURL
        - 記事の作成日
    - 記事2
        - 記事タイトル
        - 記事のURL
        - 記事の作成日
    - 記事3
        - 記事タイトル
        - 記事のURL
        - 記事の作成日
 

多次元配列をソートするには**array_multisort()**を使用します。
第一引数にソートの基準となる要素が格納された配列（今回の場合は記事の作成日でソート）
第二引数にソートの方式（昇順か降順か）
第三引数にソートしたい配列
をそれぞれ指定していきます。

配列のソートについては以下の記事を参考にしました。
[多次元配列のソート：array_multisort関数](https://gray-code.com/php/sort-of-multi-dimensional-array/)

## 3.foreachで配列を回して一件ずつ表示
後は、必要に応じてforeachで$listBLogsを回してあげればOKです。
以下は一例です。記事タイトルに各記事へのaタグを出力したものです。
CakePHP3の書き方に準拠してます。

```php

<?php foreach($listBlogs as $listBlog): ?>
     <a href="<?= $listBLog['url'] ?>"><h2><?= $listBLog['title'] ?></h2></a>
     
<?php endforeach; ?>

```