<?php
/**
 * ColumnController - コラム記事（EACNO解説・ビッグファイブ理論・MBTI比較 等）
 *
 * 記事を追加するには:
 *   1. getArticles() にメタデータを1行追加
 *   2. views/pages/column/{slug}.php を作成
 */
require_once BASE_PATH . '/controllers/BaseController.php';

class ColumnController extends BaseController
{
    /**
     * 記事メタデータ一覧
     *
     * @return array slug => [title, description, category, updated_at]
     */
    public static function getArticles(): array
    {
        return [
            'eacno' => [
                'title'       => '【公式】EACNO性格タイプ一覧｜32タイプの特徴・適職・相性を完全解説',
                'description' => 'BIG5-BASICが考案・開発したEACNO表記法を公式解説。累計' . TOTAL_USERS_FULL . '受検データのうち' . SAMPLE_SIZE_FULL . 'のサンプル分析から算出した32タイプの特徴・適職・相性を網羅。無料診断で自分のタイプを確認できます。',
                'category'    => 'BIG5-BASIC',
                'updated_at'  => '2026-05-02',
            ],
            'rare-types-top5' => [
                'title'       => '【希少タイプTOP5】出現率0.18%〜の超レア性格を解説',
                'description' => 'BIG5-BASICの' . SAMPLE_SIZE_FULL . 'サンプル分析から判明した最も希少なEACNO性格タイプTOP5。1位EHCTS(0.18%・556人に1人)から5位EHCTO(0.51%)まで、特徴・適職・有名人・なぜ希少なのかを徹底解説。',
                'category'    => 'BIG5-BASIC',
                'updated_at'  => '2026-05-02',
            ],
            'bhi5' => [
                'title'       => '【BHI5】日本人幸福指数ダッシュボード｜BIG5-BASIC独自指標を月次更新',
                'description' => 'BIG5-BASICが累計170万人受検データから算出する独自指標「BHI5（日本人幸福指数）」のダッシュボード。2026年5月版は81.8。5因子T得点+満足度の合成で、全国・性別・年代・都道府県・業種別に月次公開。',
                'category'    => '統計レポート',
                'updated_at'  => '2026-05-02',
            ],
            'survey-2026-vol1' => [
                'title'       => '【統計レポートvol.1】日本人27,097人ビッグファイブ実態調査2026年版サマリー',
                'description' => 'BIG5-BASICが直近27,097人の診断データから判明した日本人の性格傾向を統計レポートとして公開。5因子の分布・32タイプ実出現率・年代別満足度のU字曲線・性別差・信頼性ランクを網羅。月次の定期統計レポートシリーズvol.1。',
                'category'    => '統計レポート',
                'updated_at'  => '2026-05-02',
            ],
            'survey-2026-vol2-cross-matrix' => [
                'title'       => '【統計レポートvol.2】男女×年代×職業 9通りの幸福度マトリクス｜27,097人クロス分析',
                'description' => '性別・年代・職業を組み合わせた9つの代表グループ（10代女子学生・30代男性会社員・40代男性経営者など）の幸福度マトリクスを公開。属性によって変わる「幸せの形」を27,097人の最新データで解析。',
                'category'    => '統計レポート',
                'updated_at'  => '2026-05-05',
                'publish_date'=> '2026-05-05',
            ],
            'survey-2026-vol3-prefecture-ranking' => [
                'title'       => '【統計レポートvol.3】47都道府県別 性格傾向ランキング2026｜「県民性」は科学的に存在するか',
                'description' => '27,097人のデータから47都道府県すべての満足度と5因子傾向を集計。長崎・山口・大分がTOP3、石川・沖縄・和歌山が下位。地域ブロック分析で「県民性」の実態を検証します。',
                'category'    => '統計レポート',
                'updated_at'  => '2026-05-08',
                'publish_date'=> '2026-05-08',
            ],
            'survey-2026-vol4-industry-profile' => [
                'title'       => '【統計レポートvol.4】14業種別 性格プロファイル完全版｜業界で性格は本当に違うのか',
                'description' => 'IT・医療・金融・教育・コンサルなど14業種別の性格プロファイルと満足度を分析。コンサル(3.45)が最高、IT・通信は意外に普通(3.27)。業界の性格カタログ2026年版。',
                'category'    => '統計レポート',
                'updated_at'  => '2026-05-11',
                'publish_date'=> '2026-05-11',
            ],
            'survey-2026-vol5-reliability-comparison' => [
                'title'       => '【統計レポートvol.5】自分を「盛る人」の性格には共通点がある｜信頼性S群とD群の決定的な違い',
                'description' => '正直に答えた高信頼性S群2,217人と盛って答えたD群835人の性格構造を比較。D群は5因子全てがT=53〜62と異常に高く、満足度も0.55ポイント高く回答する驚きの発見。',
                'category'    => '統計レポート',
                'updated_at'  => '2026-05-14',
                'publish_date'=> '2026-05-14',
            ],
            'survey-2026-vol6-compatibility-matrix' => [
                'title'       => '【統計レポートvol.6】32×32相性マトリクス完全版｜EACNO 496通りカップル全相性スコア',
                'description' => 'EACNO 32タイプから生まれる計496通りのカップル組み合わせ全てに、ビッグファイブ研究に基づく相性スコアを算出した完全マトリクス。タイプ別の相性最強・最悪パートナーが分かります。',
                'category'    => '統計レポート',
                'updated_at'  => '2026-05-17',
                'publish_date'=> '2026-05-17',
            ],
            'survey-2026-vol7-traffic-source' => [
                'title'       => '【統計レポートvol.7】流入元別の性格傾向｜Google・X・Bingから来た人の性格はどう違うか',
                'description' => 'BIG5-BASICへの流入元（Google・Yahoo・Bing・X・note・各種紹介サイト）別に受検者の性格プロファイルを比較。Bing検索ユーザーが満足度最高、X(Twitter)経由はIHRTS型が多数派などの発見。シリーズ最終回。',
                'category'    => '統計レポート',
                'updated_at'  => '2026-05-20',
                'publish_date'=> '2026-05-20',
            ],
            'big5' => [
                'title'       => 'ビッグファイブ理論とは？なぜ企業・研究者が最も信頼する性格診断なのか',
                'description' => 'ビッグファイブ（Big Five）理論の5つの因子、歴史、科学的根拠をわかりやすく解説。性格を5次元で記述する心理学で最も信頼性の高い性格モデルです。',
                'category'    => '性格心理学',
                'updated_at'  => '2026-03-14',
            ],
            'mbti-vs-big5' => [
                'title'       => 'MBTIとビッグファイブの違いとは？16Personalitiesの正体も含めて徹底比較',
                'description' => 'MBTIとビッグファイブの違いを科学的根拠・分類方法・再現性の観点から比較。16Personalitiesの正体、EACNO⇔MBTI変換表（全32タイプ）、どちらを選ぶべきかも解説します。',
                'category'    => '比較・解説',
                'updated_at'  => '2026-04-03',
            ],
            'reliability' => [
                'title'       => '「盛って答えた」診断結果は信頼できる？性格テストが嘘を見抜く仕組み',
                'description' => 'BIG5-BASICの「テストの信頼性」機能を解説。3つの虚偽尺度（見栄・本音・防衛）で回答の偏りを検出し、S〜Dの5段階で診断結果の信頼度を評価する仕組みを紹介します。',
                'category'    => 'BIG5-BASIC',
                'updated_at'  => '2026-03-14',
            ],
            'self-analysis-method' => [
                'title'       => '自己分析のやり方5選｜就活・転職で本当に使える方法を科学的に比較',
                'description' => '自己分析の代表的な5つの方法を目的別に比較。診断データで見る年代別の性格変化や、科学的な自己分析の進め方を3ステップで解説します。',
                'category'    => '自己分析',
                'updated_at'  => '2026-03-15',
            ],
            'personality-test-comparison' => [
                'title'       => '【2026年版】無料性格診断おすすめ10選｜公式URL付き徹底比較ガイド',
                'description' => 'MBTI・ビッグファイブ・エニアグラム・ディグラム・ストレングスファインダー・岡田斗司夫4タイプ・HEXACOなど主要10診断を公式URLとともに徹底比較。科学的根拠・精度・料金・用途・所要時間・27,097人独自データ分析で目的別最適選択を解説。',
                'category'    => '比較・解説',
                'updated_at'  => '2026-05-02',
            ],
            'find-your-strengths' => [
                'title'       => '「強みがわからない」人へ｜ビッグファイブが示す、あなただけの強みの見つけ方',
                'description' => '強みがわからない3つの心理学的理由と、ビッグファイブの5因子から強みを見つける方法を解説。診断データによる職業別の性格傾向も紹介します。',
                'category'    => '自己分析',
                'updated_at'  => '2026-03-15',
            ],
            'scientific-personality-test' => [
                'title'       => '血液型・MBTI・エニアグラムは科学的？心理学者が認める性格診断の条件とは',
                'description' => '血液型・占い・SNS診断がなぜ科学的でないのかを解説し、心理測定学の3つの基準（信頼性・妥当性・標準化）からビッグファイブの科学的根拠を紹介します。',
                'category'    => '性格心理学',
                'updated_at'  => '2026-03-15',
            ],
            'career-aptitude-personality' => [
                'title'       => '性格タイプ別・向いている仕事とは？ビッグファイブで見る適職診断の科学',
                'description' => '5因子の組み合わせから適職パターンを解説。診断データによる職業別の性格傾向と、タイプ別ストレス耐性ランキングも紹介します。',
                'category'    => '適職・キャリア',
                'updated_at'  => '2026-03-15',
            ],
            'self-analysis-es' => [
                'title'       => '性格診断の結果、ESにどう書く？就活・面接で使える自己PR変換テンプレート',
                'description' => '性格診断の結果を自己PR・強み・短所に変換するテンプレートを因子別に紹介。面接でのNG/OK回答例と、最も多い性格タイプも解説します。',
                'category'    => '就活・転職',
                'updated_at'  => '2026-03-15',
            ],
            'satisfaction-personality' => [
                'title'       => '幸せな人の性格に共通する3つの特徴｜27,097人データで判明した満足度の法則',
                'description' => 'BIG5-BASICの診断データ27,097人(うち19,104人が満足度回答)を分析し、生活満足度と最も強く結びつく性格因子を特定。外向性・情動性・誠実性の3因子が満足度を左右する理由を解説します。',
                'category'    => '満足度×性格',
                'updated_at'  => '2026-05-02',
            ],
            'type-satisfaction-ranking' => [
                'title'       => '【全32タイプ】幸福度ランキング｜1位と最下位の性格の決定的な違いとは',
                'description' => 'EACNO表記法の32タイプ別に平均満足度をランキング化。19,104人の最新データから、1位のEACNO（3.75）から32位のIHRTS（2.63）まで、全タイプの順位とその傾向を分析します。',
                'category'    => '満足度×性格',
                'updated_at'  => '2026-05-02',
            ],
            'gender-satisfaction' => [
                'title'       => '「幸せな性格」は男女で違った｜17,227人のデータが示した意外な結果',
                'description' => '男女の満足度平均はほぼ同じ(女3.25/男3.20)。しかし満足度を高める性格因子は異なり、特に男性は外向性(+7.21)が突出して影響することが17,227人の最新分析で判明しました。',
                'category'    => '満足度×性格',
                'updated_at'  => '2026-05-02',
            ],
            'age-satisfaction' => [
                'title'       => '幸福度のU字曲線が判明｜10代と60代が高く30代が底【19,104人分析】',
                'description' => '10代〜60代の年代別に、生活満足度と性格因子の関係を分析。60代3.50・10代3.41・30代3.05が底というU字曲線、10代の協調性、50代の勤勉性+8.14など、年齢で変わる「幸福の鍵」を解説します。',
                'category'    => '満足度×性格',
                'updated_at'  => '2026-05-02',
            ],
            'stress-and-satisfaction' => [
                'title'       => '高ストレスでも幸せな人の性格とは？776人のデータが示す「折れない人」の共通点',
                'description' => 'ストレスと満足度の関係を19,104人で分析し、高ストレス×高満足の776人の性格パターンを解明。外向性と協調性がストレスに負けない性格の鍵であることを最新データで示します。',
                'category'    => '満足度×性格',
                'updated_at'  => '2026-05-02',
            ],
            'introvert-satisfaction' => [
                'title'       => '「内向型だから不幸」は嘘だった｜9,538人のデータが示す内向型の幸福パターン',
                'description' => '内向型の約3割は満足度が高い。幸せな内向型を分ける因子は外向性ではなく勤勉性(+4.15)と情動性(+3.97)。19,104人の最新データが示す「内向型の幸福の方程式」を解説。',
                'category'    => '満足度×性格',
                'updated_at'  => '2026-05-02',
            ],
            'job-satisfaction' => [
                'title'       => '会社経営者の満足度が最高｜職業別×性格×幸福度の意外な関係を19,104人で分析',
                'description' => '11職業×BIG5の関係を分析。会社経営者(3.89)・学生(3.43)・公務員(3.32)が高く、無職(2.57)・契約派遣(2.84)が低い。職業で異なる満足度パターンと、最新19,104人データでのIT・通信業種の再評価を解説。',
                'category'    => '満足度×性格',
                'updated_at'  => '2026-05-02',
            ],
            'type-a-personality' => [
                'title'       => '頑張り屋さんほど不幸？競争心が強い人の満足度データが示す皮肉な真実',
                'description' => '競争心（Emu）尺度と満足度の関係を3,639人で分析。おおらかな人ほど幸せで、ストレス状況との交差分析や性別・年代別の傾向も紹介します。',
                'category'    => '満足度×性格',
                'updated_at'  => '2026-03-16',
            ],
            'ego-strength' => [
                'title'       => '折れない人の性格の秘密｜「問題対処能力」が幸福度に与える影響を19,104人で検証',
                'description' => 'BIG5では測れない「問題対処能力（Pro）」が生活満足度を左右する。19,104人の最新データで五分位分析を再検証、最低群2.93 vs 最高群3.58の差からレジリエンスの本質に迫ります。',
                'category'    => '下位尺度分析',
                'updated_at'  => '2026-05-02',
            ],
            'anger-types' => [
                'title'       => 'イライラしやすい人は不幸？4つの怒りタイプ×満足度データで見えた意外な事実',
                'description' => '敵意尺度(HOS)と満足度の関係を19,104人で分析。HOS×満足度の相関 r=-0.188は前回3,639人分析と同水準で再確認。攻撃衝動と猜疑心で分類した4つの怒りタイプ別に幸福度を解説します。',
                'category'    => '下位尺度分析',
                'updated_at'  => '2026-05-02',
            ],
            'shyness-vs-self-denial' => [
                'title'       => '「内気」と「自己否定」は別物だった｜内向型が不幸になる本当の原因を19,104人で特定',
                'description' => '内気(Si1)と自己否定(Si5)を分離して分析。最新19,104人データの4象限分析では、内気低×自己否定低が満足度3.58、内気高×自己否定高が2.87と最大の差。内気と自己否定どちらが満足度を下げるかを再検証します。',
                'category'    => '下位尺度分析',
                'updated_at'  => '2026-05-02',
            ],
            'social-maladjustment' => [
                'title'       => '劣等感が強い人はなぜ幸せになりにくい？ビッグファイブより影響力が大きい性格要素',
                'description' => '社会的不適応度（Soc）r=-0.259、心の問題（Ph）r=-0.319、劣等感（Ic）r=-0.319。ビッグファイブの個別因子より強い負の相関を持つ下位尺度を分析します。',
                'category'    => '下位尺度分析',
                'updated_at'  => '2026-03-16',
            ],
            'depression-type-ranking' => [
                'title'       => 'あなたのタイプはメンタルが強い？弱い？32タイプ別・不安リスクランキングを公開',
                'description' => '悲観（Pes）・不安感（Jit）・恐怖心（Fe）・神経質（Nt）の4尺度で32タイプをランキング。IHRTS（58.72）からEHCNO（39.02）まで全タイプのリスク傾向を公開します。',
                'category'    => '満足度×性格',
                'updated_at'  => '2026-03-16',
            ],
            'test-reliability-personality' => [
                'title'       => '「正直に答えた人」と「盛って答えた人」、幸せなのはどっち？5,233人のデータで検証',
                'description' => '信頼性ランクD（満足度3.66）vsランクS（3.10）。見栄（Va）や本音隠し（Ti）の裏にある性格特性を5,233人のデータで分析。回答スタイルが映す心理とは。',
                'category'    => 'BIG5-BASIC',
                'updated_at'  => '2026-03-16',
            ],
            'regional-personality' => [
                'title'       => '広島県民はなぜ幸せ？都道府県別の性格と満足度ランキングをデータで検証',
                'description' => '2,504人の診断データから17都道府県の性格傾向と満足度をランキング。広島（3.41）が1位、宮城（2.75）が最下位。各県のBIG5因子の特徴を分析します。',
                'category'    => '満足度×性格',
                'updated_at'  => '2026-03-16',
            ],
            'four-types' => [
                'title'       => '岡田斗司夫「4タイプ診断」は信頼できる？ビッグファイブとの科学的な違いを解説',
                'description' => '岡田斗司夫さんの4タイプ判定テスト（注目型・司令型・法則型・理想型）とビッグファイブ性格診断を徹底比較。分類の仕組み、科学的根拠、信頼性の違いを解説します。',
                'category'    => '比較・解説',
                'updated_at'  => '2026-05-02',
            ],
            'digram' => [
                'title'       => 'ディグラム診断とビッグファイブの違いは？エゴグラムをベースにした診断を徹底比較',
                'description' => 'ディグラム診断（エゴグラムベース）とビッグファイブ性格診断を徹底比較。CP/NP/A/FC/ACの5要素と外向性・協調性・勤勉性・情動性・創造性の違い、科学的根拠の差を解説。',
                'category'    => '比較・解説',
                'updated_at'  => '2026-04-03',
            ],
            'scientific-test' => [
                'title'       => 'あなたの性格診断、本当に信頼できる？科学的な心理テストを見分ける5つの条件',
                'description' => 'ネットの性格診断、本当に信頼できる？信頼性・妥当性・標準化など科学的な心理テストの5つの条件を解説。MBTI、エニアグラム、ビッグファイブなど主要診断の評価も。',
                'category'    => '比較・解説',
                'updated_at'  => '2026-04-03',
            ],
            'hexaco-what-is' => [
                'title'       => 'HEXACOとは？BIG5との違いと6因子の意味を徹底解説',
                'description' => 'HEXACOモデルの6因子（H/E/X/A/C/O）の意味とBIG5との決定的な違いを解説。BIG5には存在しないH因子（正直・謙虚さ）がなぜ重要なのかを心理学的に説明します。',
                'category'    => 'HEXACO',
                'updated_at'  => '2026-04-21',
            ],
            'hexaco-diagnosis-guide' => [
                'title'       => 'HEXACO診断の結果の見方｜6因子と24ファセットを徹底解説',
                'description' => 'HEXACO診断レポートの読み方を完全ガイド。6因子スコア・24ファセット・Shadow Profile・タイプ名の4層構造を解説し、結果を日常・キャリアに活かす方法を紹介。',
                'category'    => 'HEXACO',
                'updated_at'  => '2026-04-21',
            ],
            'h-factor-honesty-humility' => [
                'title'       => 'H因子（正直・謙虚さ）とは？BIG5にない6つ目の性格軸',
                'description' => 'HEXACOの核心・H因子（Honesty-Humility）を徹底解説。4つのファセット、高い人・低い人の特徴、ダーク・トライアドとの関係、職場での役割を心理学データをもとに説明。',
                'category'    => 'HEXACO',
                'updated_at'  => '2026-04-21',
            ],
            'dark-triad-guide' => [
                'title'       => 'ダーク・トライアド完全ガイド｜マキャベリズム・ナルシシズム・サイコパシー',
                'description' => 'ダーク・トライアド（マキャベリズム・ナルシシズム・サイコパシー）をHEXACOの観点から解説。3特性の定義・職場への影響・自分のスコアの活かし方を網羅的に解説します。',
                'category'    => 'HEXACO',
                'updated_at'  => '2026-04-21',
            ],
            'mbti-vs-hexaco' => [
                'title'       => 'MBTIとHEXACOの違い｜科学的根拠で選ぶ性格診断',
                'description' => 'MBTIとHEXACOを科学的妥当性・再検査信頼性・測定次元から徹底比較。MBTIの問題点と、HEXACOが倫理的行動やダーク特性まで測定できる理由を解説します。',
                'category'    => 'HEXACO',
                'updated_at'  => '2026-04-21',
            ],
            'narcissist-traits' => [
                'title'       => 'ナルシシストの特徴8つ｜見分け方と対処法【HEXACO心理学】',
                'description' => 'ナルシシストの特徴8つを心理学的に解説。HEXACOのH因子・X因子との関係、職場・恋愛での見分け方、ガスライティングへの対処法を具体的に紹介します。',
                'category'    => 'HEXACO',
                'updated_at'  => '2026-04-21',
            ],
            'machiavellianism-workplace' => [
                'title'       => '職場にいるマキャベリストの見分け方と対処法',
                'description' => '職場のマキャベリストを見分ける7つのサインと、記録・可視化・利害交渉など具体的な対処法を解説。HEXACOのH因子・A因子とマキャベリズムの関係も説明します。',
                'category'    => 'HEXACO',
                'updated_at'  => '2026-04-21',
            ],
            'good-people-exploited' => [
                'title'       => 'なぜ良い人ほど損をする？H因子と「善意の罠」',
                'description' => '「良い人ほど損をする」現象をHEXACOのH因子・ギバー度から解説。互恵性の非対称性のメカニズム、善意が罠になる4パターン、善意を守りながら生き抜く5つの方法を紹介。',
                'category'    => 'HEXACO',
                'updated_at'  => '2026-04-21',
            ],
            'hexaco-shadow-side' => [
                'title'       => 'HEXACOで測る「影の顔」｜ダーク側面の心理学',
                'description' => 'HEXACOのShadow Profile（マキャベリズム・ナルシシズム・サイコパシー・詐欺師適性・ギバー度・タイプ希少性）の意味と活用シーンを解説。ダーク指標の正しい読み方も紹介。',
                'category'    => 'HEXACO',
                'updated_at'  => '2026-04-21',
            ],
            'hexaco-30-types' => [
                'title'       => 'HEXACO 代表タイプ一覧｜あなたのタイプとその意味',
                'description' => 'HEXACOの6因子（H/E/X/A/C/O）の高低パターンから生まれる代表的なタイプを一覧で解説。単因子タイプ6種・2因子組み合わせ15種・バランス型とタイプ希少性も説明。',
                'category'    => 'HEXACO',
                'updated_at'  => '2026-04-21',
            ],
            'compatibility-tool' => [
                'title'       => '2人の性格相性診断｜BIG5/EACNOで見る恋愛・カップル・夫婦の相性ツール',
                'description' => '32タイプから2人を選ぶだけで、ビッグファイブ研究に基づく相性スコア（0-100）が瞬時に分かる無料ツール。強み・課題・関係を深めるアドバイスも表示。URLでの結果共有・SNSシェアにも対応。',
                'category'    => '相性診断',
                'updated_at'  => '2026-04-30',
            ],
            'eacno-hexaco-mapping' => [
                'title'       => 'EACNO×HEXACO 対応マップ｜あなたの「6つ目の顔」H因子が分かる',
                'description' => 'EACNO（5因子）とHEXACO（6因子）の対応関係をマッピング。EACNOタイプを入力すると、H因子の高低で分岐する3つのHEXACO推定タイプを%付きで表示する独自ツール。',
                'category'    => 'HEXACO',
                'updated_at'  => '2026-04-30',
            ],
            'work-compatibility-tool' => [
                'title'       => '職場の人間関係 相性診断｜上司・部下・同僚のBIG5/EACNO性格相性を分析',
                'description' => 'EACNO 32タイプ × 役割（上司／部下／同僚）から職場の相性スコア（0-100）を算出。報連相・フィードバック・会議スタイルなどコミュニケーション設計のヒントと、役割別の具体的アドバイス付き無料ツール。',
                'category'    => '相性診断',
                'updated_at'  => '2026-05-01',
            ],
            'family-compatibility-map' => [
                'title'       => '家族相性診断マップ｜親子・夫婦・兄弟姉妹のBIG5/EACNO性格相性を可視化',
                'description' => '親子・夫婦・兄弟姉妹のEACNOタイプから、家族最大5人の全ペア相性を一括分析。家族全体の5因子バランス・最強ペア・補強ポイントも可視化する無料ツール。',
                'category'    => '相性診断',
                'updated_at'  => '2026-05-01',
            ],
            'friend-compatibility-tool' => [
                'title'       => '友達相性診断｜親友・カジュアル・同窓のBIG5/EACNO性格相性を分析',
                'description' => 'EACNO 32タイプから友達同士の相性を診断。親友・カジュアル・同窓の3種類の友情タイプ別に、類似性と補完性のバランスを分析する無料ツール。',
                'category'    => '相性診断',
                'updated_at'  => '2026-05-01',
            ],
            'team-compatibility-simulator' => [
                'title'       => 'チーム相性診断｜3〜5人のBIG5/EACNO性格バランスを分析',
                'description' => 'チームメンバー3〜5人のEACNOタイプから、ペア相性マトリクス・チーム全体の強み弱み・多様性スコア・補強提案を分析する無料ツール。HR・PM・チームリーダー向け。',
                'category'    => '相性診断',
                'updated_at'  => '2026-05-01',
            ],
            'who-matches-you' => [
                'title'       => 'あなたに合う人診断｜BIG5/EACNOで見る恋愛・友達・仕事の相性ベスト5',
                'description' => 'あなたのEACNOタイプ1つを入力するだけで、恋愛・友達・仕事の3軸で「合うタイプTOP5」を表示。相手のタイプを知らなくても使える、相性診断シリーズの入口ツール。',
                'category'    => '相性診断',
                'updated_at'  => '2026-05-02',
            ],
            'compatibility-series' => [
                'title'       => 'BIG5相性診断シリーズ｜恋愛・友達・家族・職場の性格相性を一括で',
                'description' => 'BIG5-BASIC が提供する全6種類の相性診断ツールを用途別に一覧表示。恋愛・友達・家族・職場・チーム・自分に合う人診断まで、人間関係を性格科学で分析できるシリーズハブページ。',
                'category'    => '相性診断',
                'updated_at'  => '2026-05-02',
            ],
            'eacno-love-top10' => [
                'title'       => 'EACNO 恋愛相性ランキングTOP10｜BIG5で見る『相性最強カップル』はこの組み合わせ',
                'description' => '全32タイプから生まれる496通りの組み合わせを、ビッグファイブ研究に基づいてスコア化。最も相性が良いカップルTOP10を、なぜ相性が良いのかの根拠付きで解説。',
                'category'    => '相性診断',
                'updated_at'  => '2026-05-02',
            ],

            // ─── 新規25本コラム（2026-05-02公開）──────────────────────────
            // 自己分析カテゴリ（5本）
            'self-analysis-one-hour' => [
                'title'       => '自己分析を1時間で終わらせる方法｜性格診断起点の最短ルート',
                'description' => '自己分析が終わらない原因と、性格診断（BIG5-BASIC）を起点に1時間で完結させる10分×6ステップ。3つの成果物（プロファイルシート・強み弱み・自己PR雛形）を確実に手にする最短手順。',
                'category'    => '自己分析',
                'updated_at'  => '2026-05-02',
            ],
            'weakness-to-strength-template' => [
                'title'       => '短所を長所に言い換える完全テンプレート｜ビッグファイブ別40例',
                'description' => '面接・ESで使える短所→長所の言い換え40パターンを5因子別（外向性・協調性・勤勉性・情動性・創造性）に整理。NG例3つと業種別の使い分け、説得力ある添え方も解説。',
                'category'    => '自己分析',
                'updated_at'  => '2026-05-02',
            ],
            'self-vs-others-analysis' => [
                'title'       => '自己分析と他己分析の違い｜19,104人で判明した「自己評価のずれ」',
                'description' => '自己分析の盲点と他己分析の必要性を19,104人データで検証。信頼性ランクS群vsD群で7〜10ポイントずれる事実、5人法・360度法の手順、診断データで他者視点を補完する方法を解説。',
                'category'    => '自己分析',
                'updated_at'  => '2026-05-02',
            ],
            'self-analysis-meaningless' => [
                'title'       => '自己分析が「意味ない」と感じる本当の理由｜診断疲れの心理学',
                'description' => '自己分析が意味ないと感じる5パターンと心理学的背景（過剰反芻・選択肢過多・客観基準の不在）を整理。再起動するための5つの問いと、客観基準としてのビッグファイブ活用法を解説。',
                'category'    => '自己分析',
                'updated_at'  => '2026-05-02',
            ],
            'motivation-graph-personality' => [
                'title'       => 'モチベーショングラフ×性格因子｜あなたの「やる気曲線」のパターン分類',
                'description' => '就活定番のモチベーショングラフを性格5因子で読み解く方法。安定上昇型・山谷激しい型・一発逆転型・後半開花型の4パターンと、自己PRへの活かし方、深掘り質問20問を紹介。',
                'category'    => '自己分析',
                'updated_at'  => '2026-05-02',
            ],

            // 性格心理学カテゴリ（8本）
            'personality-genetics-environment' => [
                'title'       => '性格は遺伝で決まる？双子研究と19,104人データで見る「50対50」の真実',
                'description' => '性格の遺伝率40〜60%・共有環境ほぼ0・非共有環境40〜50%という行動遺伝学の知見を、双子研究（Bouchard・Plomin）と19,104人データで解説。性格を変えたい人への科学的アドバイスも。',
                'category'    => '性格心理学',
                'updated_at'  => '2026-05-02',
            ],
            'ocean-vs-eacno' => [
                'title'       => 'OCEAN と EACNO の違い｜なぜBIG5-BASICはビッグファイブの順番を変えたのか',
                'description' => '海外標準のOCEAN（O-C-E-A-N）と、BIG5-BASIC独自のEACNO（E-A-C-N-O）の違いを解説。情動性のスコア反転・32タイプ命名・日本語の自然順序など4つの採用理由と完全対応表。',
                'category'    => '性格心理学',
                'updated_at'  => '2026-05-02',
            ],
            'personality-change-mechanism' => [
                'title'       => '性格は変わる？大人になっても変化する5因子のメカニズム',
                'description' => '世界の縦断研究（Roberts、Soto等）と19,104人データから、性格5因子の年代別変化パターンを解説。協調性・勤勉性・情動性は60代まで上昇する成熟原則と、性格を変える3つのメカニズム。',
                'category'    => '性格心理学',
                'updated_at'  => '2026-05-02',
            ],
            'temperament-vs-personality' => [
                'title'       => '気質と性格の違いをわかりやすく｜遺伝的気質と後天的性格の境界',
                'description' => '気質（生まれつきの生物学的傾向）と性格（環境・経験で形成される総合的個性）の違いを心理学的に整理。Thomas&Chess気質9次元、ビッグファイブとの対応、子育て・自己理解への応用まで。',
                'category'    => '性格心理学',
                'updated_at'  => '2026-05-02',
            ],
            'neuroticism-emotional-stability' => [
                'title'       => '神経症傾向（情動性）が高いとなぜ不幸？メカニズムと改善策',
                'description' => '神経症傾向（情動性が低い）と幸福度の負の相関を、世界研究と19,104人BHI5データで解説。反芻思考・ネガティブバイアス・ストレス過剰反応の4メカニズムと、CBT・マインドフルネス等の改善法。',
                'category'    => '性格心理学',
                'updated_at'  => '2026-05-02',
            ],
            'extraversion-introversion-science' => [
                'title'       => '外向性と内向性の科学｜ドーパミン・刺激閾値・脳構造から見る本当の違い',
                'description' => 'Eysenck覚醒理論・DePueドーパミン仮説・脳構造研究から、外向型と内向型の科学的違いを解説。19,104人のT得点分布、両向型（ambivert）の優位性、内向型を活かす環境設計5つを紹介。',
                'category'    => '性格心理学',
                'updated_at'  => '2026-05-02',
            ],
            'personality-maturation-age' => [
                'title'       => '性格はいつ完成する？年齢別の人格成熟データを19,104人で検証',
                'description' => '30歳完成説・一生変化説・成熟原則という3つの立場と、19,104人の年代別5因子データで「性格完成」を検証。30代がU字底になる責任ピーク仮説、50〜60代の成熟ピークの正体を解説。',
                'category'    => '性格心理学',
                'updated_at'  => '2026-05-02',
            ],
            'personality-disorder-big5' => [
                'title'       => 'パーソナリティ障害とビッグファイブの関係｜健常域との連続性',
                'description' => 'DSM-5の10タイプとビッグファイブ5因子の対応関係を整理。AMPD（次元論モデル）、健常域と障害域の連続性、自分のT得点が極端だった時の解釈、受診を検討すべきラインの目安を学術的に解説。',
                'category'    => '性格心理学',
                'updated_at'  => '2026-05-02',
            ],

            // 適職・キャリアカテゴリ（6本）
            'introvert-best-jobs-15' => [
                'title'       => '内向型に向いている仕事TOP15｜外向型より幸福度が高い職業も判明',
                'description' => 'BIG5-BASIC 19,104人データから内向型に向く職業TOP15を厳選。研究職・経理では外向型より幸福度が高い結果も。3つの環境条件、5つの避けるべき環境、業種×外向性の三次元分析を解説。',
                'category'    => '適職・キャリア',
                'updated_at'  => '2026-05-02',
            ],
            'engineer-personality-fit' => [
                'title'       => 'エンジニア・プログラマーに向く性格｜創造性と勤勉性のバランス論',
                'description' => 'IT業種1,228人データから判明したエンジニアの性格は創造性O高×勤勉性C中の組み合わせ。アーキテクト型・スペシャリスト型・クリエイター型・職人型の4タイプとキャリアパス×性格マッチを解説。',
                'category'    => '適職・キャリア',
                'updated_at'  => '2026-05-02',
            ],
            'leader-personality-profile' => [
                'title'       => 'リーダーに向く性格は？マネジメント職の5因子プロファイル',
                'description' => 'Judge et al.メタ分析と経営者・管理職データから、リーダーシップに必要な性格5因子を解説。カリスマ型・計画型・共感型・戦略型の4タイプと、向くチーム規模・リーダー育成の科学を紹介。',
                'category'    => '適職・キャリア',
                'updated_at'  => '2026-05-02',
            ],
            'entrepreneur-personality' => [
                'title'       => '起業家タイプの性格5因子｜会社員と起業家を分ける決定要因',
                'description' => 'Zhao&Seibert メタ分析と経営者164人データから、起業家を会社員と分ける5因子（創造性O極高×勤勉性C高×協調性Aやや低）を解説。3タイプの起業家像、向かない性格、副業での適性検証法も。',
                'category'    => '適職・キャリア',
                'updated_at'  => '2026-05-02',
            ],
            'civil-servant-personality' => [
                'title'       => '公務員に向く性格・向かない性格｜「安定志向」の本当の意味',
                'description' => '官公庁239人データから判明した公務員プロファイル（勤勉性C高×情動性N高×創造性O低）を解説。3タイプの向き・3パターンの不向き・部署別マッチ・「安定志向」を5因子で分解した正しい解釈。',
                'category'    => '適職・キャリア',
                'updated_at'  => '2026-05-02',
            ],
            'unsuitable-job-stay-or-leave' => [
                'title'       => '「向いてない仕事」を続けるべきか辞めるべきか｜性格不一致の見抜き方',
                'description' => '性格5因子と業種別データで決める意思決定フレーム。続ける条件3つ・辞める条件3つを定量化し、3ヶ月実験の進め方、ジョブクラフティングで適応する方法、性格を変えて埋める可能性まで解説。',
                'category'    => '適職・キャリア',
                'updated_at'  => '2026-05-02',
            ],

            // 就活・転職カテゴリ（6本）
            '30s-career-change-personality' => [
                'title'       => '30代の転職と性格｜キャリア迷子から抜け出す診断データ活用法',
                'description' => '30代のBHI5は80.8で全年代最低。U字底の原因は責任ピーク×性格成熟途上のミスマッチ。失敗3パターンと5因子別の転職成功シナリオ、「キャリアの第二楽章」設計の3ステップを解説。',
                'category'    => '就活・転職',
                'updated_at'  => '2026-05-02',
            ],
            '20s-job-change-strategic' => [
                'title'       => '20代の転職、本当に必要？性格因子で見る「逃げ転職」と「攻め転職」',
                'description' => '20代6,479人の性格データから「逃げ転職」と「攻め転職」を見分ける方法。20代に多い転職病3パターン（衝動・刺激・理想）と、5因子別の攻め転職シナリオ、性格別キャリア投資を解説。',
                'category'    => '就活・転職',
                'updated_at'  => '2026-05-02',
            ],
            'motivation-letter-from-personality' => [
                'title'       => '志望動機が思いつかない人へ｜性格5因子から逆算する作り方',
                'description' => '志望動機が書けない3原因と「性格→価値観→志望動機」の逆算アプローチを解説。5因子別の動機パターン、32タイプ別書きやすい型、業界×5因子のテンプレ集、NG例3パターンと面接での語り方も。',
                'category'    => '就活・転職',
                'updated_at'  => '2026-05-02',
            ],
            '40s-career-change-personality' => [
                'title'       => '40代の転職と性格｜マネジメント経験を性格データで言語化する',
                'description' => '40代1,548人データから、成熟した協調性・勤勉性・情動性を活かす転職戦略を解説。3つの落とし穴、マネジメント経験の5因子言語化、「年齢の壁」を性格データで突破する自己PRテンプレを紹介。',
                'category'    => '就活・転職',
                'updated_at'  => '2026-05-02',
            ],
            'pressure-interview-personality' => [
                'title'       => '圧迫面接に強い性格・弱い性格｜情動性T得点と耐性の関係',
                'description' => '圧迫面接の本当の目的（性格耐性評価）と問われる4つの性格要素を解説。19,104人の情動性T得点分布、耐性が低い4タイプ、CBT・模擬面接・セルフケアの3対策、強い人が陥る罠も紹介。',
                'category'    => '就活・転職',
                'updated_at'  => '2026-05-02',
            ],
            'second-newgrad-self-pr' => [
                'title'       => '第二新卒の自己PR｜短い職歴を性格5因子で説得力ある武器に変える',
                'description' => '第二新卒の自己PRが詰まる原因と「実績→性格因子で代替」する戦略を解説。5因子別自己PR雛形、短期離職を強みに変える3パターン、20代の性格的優位性、業種別最適化、NG例添削まで網羅。',
                'category'    => '就活・転職',
                'updated_at'  => '2026-05-02',
            ],
        ];
    }

    /**
     * おすすめ記事スラッグ（人気記事セクション用）
     * 順番がそのまま表示順になる
     */
    public static function getFeaturedSlugs(): array
    {
        return [
            'big5',
            'eacno',
            'satisfaction-personality',
            'mbti-vs-big5',
            'career-aptitude-personality',
        ];
    }

    /**
     * コラム一覧ページ
     */
    public function index(): void
    {
        // 新着順（updated_at 降順）にソート
        $articles = self::getArticles();
        // 未公開記事（publish_dateが未来）を除外
        $today = date('Y-m-d');
        $articles = array_filter($articles, function ($a) use ($today) {
            return empty($a['publish_date']) || $a['publish_date'] <= $today;
        });
        uasort($articles, function ($a, $b) {
            return strcmp($b['updated_at'], $a['updated_at']);
        });

        // タイプページデータ（EACNOタイプ別セクション用）
        $dataDir          = BASE_PATH . '/data';
        $typeDetails      = file_exists($dataDir . '/type_details.php')
            ? require $dataDir . '/type_details.php' : [];
        $typeDistribution = file_exists($dataDir . '/type_distribution.php')
            ? require $dataDir . '/type_distribution.php' : [];

        // type_distribution をコード→行でインデックス化
        $distByCode = [];
        foreach ($typeDistribution as $row) {
            $distByCode[$row['code']] = $row;
        }

        // 人気記事（DBビューカウント順。コラム記事のみ対象）
        $featured     = [];
        $articleSlugs = array_keys($articles);

        try {
            $placeholders = implode(',', array_fill(0, count($articleSlugs), '?'));
            $rows = $this->db->fetchAll(
                "SELECT slug FROM b5_column_views
                  WHERE slug IN ($placeholders)
                  ORDER BY view_count DESC
                  LIMIT 5",
                $articleSlugs
            );
            foreach ($rows as $row) {
                $s = $row['slug'];
                if (isset($articles[$s])) {
                    $featured[$s] = $articles[$s] + ['url' => BASE_URL . '/column/' . $s];
                }
            }
        } catch (\Throwable $e) {
            // DB未作成・障害時は固定リストで代替
        }

        // フォールバック（DBにデータなし）
        if (empty($featured)) {
            foreach (self::getFeaturedSlugs() as $slug) {
                if (isset($articles[$slug])) {
                    $featured[$slug] = $articles[$slug] + ['url' => BASE_URL . '/column/' . $slug];
                }
            }
        }

        // 人気EACNOタイプ（DBビューカウント順、上位10件）
        $popularTypes = [];
        try {
            $rows = $this->db->fetchAll(
                "SELECT slug, view_count FROM b5_column_views
                  WHERE slug LIKE 'type/%'
                  ORDER BY view_count DESC
                  LIMIT 10"
            );
            foreach ($rows as $row) {
                $typeCode = substr($row['slug'], 5); // 'type/' を除去
                if (isset($typeDetails[$typeCode])) {
                    $popularTypes[] = [
                        'code'       => $typeCode,
                        'detail'     => $typeDetails[$typeCode],
                        'view_count' => (int)$row['view_count'],
                        'pct'        => isset($distByCode[$typeCode]) ? $distByCode[$typeCode]['pct'] : '',
                    ];
                }
            }
        } catch (\Throwable $e) {
            // テーブル未作成・DB障害時は無視
        }

        $this->render('views/pages/column/index', [
            'page_title'       => 'コラム',
            'page_description' => 'ビッグファイブ理論やEACNO表記法、MBTIとの違いなど、性格心理学に関するコラム記事の一覧です。',
            'articles'         => $articles,
            'featured'         => $featured,
            'type_details'     => $typeDetails,
            'popular_types'    => $popularTypes,
        ]);
    }

    /**
     * 個別記事ページ
     *
     * @param string $slug
     */
    public function show(string $slug): void
    {
        // スラッグサニタイズ
        $slug = preg_replace('/[^a-z0-9\-]/', '', $slug);

        // 旧スラッグ→新スラッグの301リダイレクト（URL変更時の互換性維持）
        $slugRedirects = [
            'bhi' => 'bhi5',
        ];
        if (isset($slugRedirects[$slug])) {
            header('Location: ' . BASE_URL . '/column/' . $slugRedirects[$slug], true, 301);
            exit;
        }

        $articles = self::getArticles();

        // 記事メタ存在チェック
        if (!isset($articles[$slug])) {
            http_response_code(404);
            echo '<!DOCTYPE html><html lang="ja"><head><meta charset="UTF-8"><title>404</title></head>';
            echo '<body style="font-family:sans-serif;text-align:center;padding:80px;">';
            echo '<h1>404 - 記事が見つかりません</h1>';
            echo '<a href="' . BASE_URL . '/column">コラム一覧に戻る</a></body></html>';
            return;
        }

        // ビューファイル存在チェック
        $viewPath = 'views/pages/column/' . $slug;
        if (!file_exists(BASE_PATH . '/' . $viewPath . '.php')) {
            http_response_code(404);
            echo '<!DOCTYPE html><html lang="ja"><head><meta charset="UTF-8"><title>404</title></head>';
            echo '<body style="font-family:sans-serif;text-align:center;padding:80px;">';
            echo '<h1>404 - 記事が見つかりません</h1>';
            echo '<a href="' . BASE_URL . '/column">コラム一覧に戻る</a></body></html>';
            return;
        }

        // 公開日チェック（publish_dateが未来日付の場合は404を返す）
        $meta = $articles[$slug];
        if (!empty($meta['publish_date']) && $meta['publish_date'] > date('Y-m-d')) {
            http_response_code(404);
            echo '<!DOCTYPE html><html lang="ja"><head><meta charset="UTF-8"><title>404</title></head>';
            echo '<body style="font-family:sans-serif;text-align:center;padding:80px;">';
            echo '<h1>404 - 記事が見つかりません</h1>';
            echo '<a href="' . BASE_URL . '/column">コラム一覧に戻る</a></body></html>';
            return;
        }

        $meta = $articles[$slug];

        // ページビューをカウント（ボット・プリフェッチ除外）
        $this->incrementColumnView($slug);

        // 関連記事（同カテゴリ優先 → 新着順、最大4件）
        // 未公開記事（publish_dateが未来）を除外
        $today = date('Y-m-d');
        $sameCategory = [];
        $otherCategory = [];
        foreach ($articles as $s => $a) {
            if ($s === $slug) continue;
            if (!empty($a['publish_date']) && $a['publish_date'] > $today) continue;
            if ($a['category'] === $meta['category']) {
                $sameCategory[$s] = $a;
            } else {
                $otherCategory[$s] = $a;
            }
        }
        // 両方とも新着順
        uasort($sameCategory, fn($a, $b) => strcmp($b['updated_at'], $a['updated_at']));
        uasort($otherCategory, fn($a, $b) => strcmp($b['updated_at'], $a['updated_at']));
        $related = array_slice($sameCategory + $otherCategory, 0, 4, true);

        // EACNO記事用の追加データ
        $extra = [];
        if ($slug === 'eacno') {
            $dataDir = BASE_PATH . '/data';
            $extra['eacno_summary']     = file_exists($dataDir . '/eacno_summary.php')
                ? require $dataDir . '/eacno_summary.php' : [];
            $extra['type_details']      = file_exists($dataDir . '/type_details.php')
                ? require $dataDir . '/type_details.php' : [];
            $extra['type_distribution'] = file_exists($dataDir . '/type_distribution.php')
                ? require $dataDir . '/type_distribution.php' : [];
        }

        $this->render($viewPath, array_merge([
            'page_title'       => $meta['title'],
            'page_description' => $meta['description'],
            'site_name'        => ($meta['category'] === 'HEXACO') ? 'HEXACO-BASIC' : 'BIG5-BASIC',
            'article_meta'     => $meta,
            'current_slug'     => $slug,
            'related_articles' => $related,
            'all_articles'     => $articles,
        ], $extra));
    }

    /**
     * コラム記事のページビューをインクリメントする。
     * ボット・X-Purpose: preview・プリフェッチは除外。
     * テーブル未存在など DB エラーは握りつぶす（ユーザー体験に影響させない）。
     */
    private function incrementColumnView(string $slug): void
    {
        // ボット判定（User-Agent）
        $ua = strtolower($_SERVER['HTTP_USER_AGENT'] ?? '');
        $botPatterns = ['bot', 'crawler', 'spider', 'slurp', 'facebookexternalhit',
                        'preview', 'fetch', 'curl', 'wget', 'python', 'java/'];
        foreach ($botPatterns as $pat) {
            if (strpos($ua, $pat) !== false) return;
        }
        // ブラウザのプリフェッチ除外
        if (!empty($_SERVER['HTTP_X_PURPOSE']) || !empty($_SERVER['HTTP_X_MOZ'])) return;

        try {
            $this->db->execute(
                'INSERT INTO b5_column_views (slug, view_count)
                      VALUES (?, 1)
                      ON DUPLICATE KEY UPDATE view_count = view_count + 1',
                [$slug]
            );
        } catch (\Throwable $e) {
            // テーブル未作成・DB障害時は無視
        }

        // 日別テーブルにも記録（累計テーブルとは独立して障害時を無視）
        try {
            $this->db->execute(
                'INSERT INTO b5_column_views_daily (slug, view_date, view_count)
                      VALUES (?, CURDATE(), 1)
                      ON DUPLICATE KEY UPDATE view_count = view_count + 1',
                [$slug]
            );
        } catch (\Throwable $e) {
            // テーブル未作成・DB障害時は無視
        }
    }

    /**
     * EACNOタイプ個別ページ（/column/eacno/{TYPE}）
     *
     * @param string $typeCode 5文字のEACNOタイプコード（例: EACNO, IHRTS）
     */
    public function showEacnoType(string $typeCode): void
    {
        $dataDir = BASE_PATH . '/data';
        $typeDetails      = file_exists($dataDir . '/type_details.php')
            ? require $dataDir . '/type_details.php' : [];
        $eacnoSummary     = file_exists($dataDir . '/eacno_summary.php')
            ? require $dataDir . '/eacno_summary.php' : [];
        $typeDistribution = file_exists($dataDir . '/type_distribution.php')
            ? require $dataDir . '/type_distribution.php' : [];

        if (!isset($typeDetails[$typeCode])) {
            http_response_code(404);
            $page_title       = 'ページが見つかりません';
            $page_description = '';
            $base_url         = BASE_URL;
            require BASE_PATH . '/views/pages/404.php';
            return;
        }

        $detail  = $typeDetails[$typeCode];
        $summary = $eacnoSummary[$typeCode] ?? ['text' => ''];

        // ページビューをカウント（'type/' プレフィックスで記事スラッグと衝突を防ぐ）
        $this->incrementColumnView('type/' . $typeCode);

        // 出現率・ランクを取得
        $rank = null;
        $pct  = '';
        foreach ($typeDistribution as $row) {
            if ($row['code'] === $typeCode) {
                $rank = $row['rank'];
                $pct  = $row['pct'];
                break;
            }
        }

        // 1文字違いの関連タイプを算出（最大5件）
        $letters = str_split($typeCode);
        $pairs   = [['E', 'I'], ['A', 'H'], ['C', 'R'], ['N', 'T'], ['O', 'S']];
        $relatedTypes = [];
        foreach ($pairs as $i => [$a, $b]) {
            $alt           = ($letters[$i] === $a) ? $b : $a;
            $newLetters    = $letters;
            $newLetters[$i] = $alt;
            $relatedCode   = implode('', $newLetters);
            if (isset($typeDetails[$relatedCode])) {
                $relatedTypes[] = $relatedCode;
            }
        }

        // 関連記事（EACNOコラム、MBTI比較記事等を含む上位4件・未公開記事除外）
        $articles = self::getArticles();
        $today    = date('Y-m-d');
        $related  = array_filter($articles, function ($a, $s) use ($today) {
            if ($s === 'eacno') return false;
            if (!empty($a['publish_date']) && $a['publish_date'] > $today) return false;
            return true;
        }, ARRAY_FILTER_USE_BOTH);
        uasort($related, fn($a, $b) => strcmp($b['updated_at'], $a['updated_at']));
        $related  = array_slice($related, 0, 4, true);

        // 出現率ラベル（rankが取得できた場合のみ付与）
        $rankLabel = ($rank !== null) ? "出現率{$rank}位/32" : '出現率データなし';
        $pctLabel  = ($pct !== '') ? "{$pct}" : '';

        $pageTitle       = "{$typeCode}({$detail['nickname']})｜{$rankLabel}の特徴・適職・相性";
        $pageDescription = "BIG5-BASIC公式｜EACNO {$typeCode}タイプ「{$detail['nickname']}」の性格・特徴・適職・相性を解説。32タイプ中の出現率は{$rank}位（{$pctLabel}）で、" . ($rank !== null && $rank <= 10 ? '比較的多いタイプ' : ($rank !== null && $rank >= 23 ? '希少なレアタイプ' : '中間的な分布のタイプ')) . "です。参考MBTI：{$detail['mbti']}。ビッグファイブ研究に基づく32タイプ間の相性スコアも掲載。無料診断で自分のタイプを確認できます。";

        $this->render('views/pages/column/eacno-type', [
            'page_title'        => $pageTitle,
            'page_description'  => $pageDescription,
            'type_code'         => $typeCode,
            'detail'            => $detail,
            'summary'           => $summary,
            'rank'              => $rank,
            'pct'               => $pct,
            'related_types'     => $relatedTypes,
            'type_details'      => $typeDetails,
            'type_distribution' => $typeDistribution,
            'related_articles'  => $related,
            'all_articles'      => $articles,
            'current_slug'      => 'eacno',
        ]);
    }
}
