前提条件・実現したいこと
下記表の『title』というテーブルの中にあるデータを使います。
id | title_name | mae | ato |
---|---|---|---|
1 | タイトルA | 0 | 2 |
2 | タイトルB | 1 | 3 |
3 | タイトルC | 2 | 0 |
4 | タイトルA-1 | 0 | 7 |
5 | タイトルA-1-1 | 0 | 6 |
6 | タイトルA-1-2 | 5 | 1 |
7 | タイトルA-2 | 4 | 0 |
『mae』キーは現在のidにて、前のidになるものを参照しています。
『ato』キーは現在のidにて、後のidになるものを参照しています。
例えば、id=2の時のmaeキー=1は、id=1を。atoキー=3はid=3を参照します。
このmaeキーとatoキーを参照して、下記のようにタイトルを並び替えたいです。
成功例:
タイトルA
タイトルA-1
タイトルA-1-1
タイトルA-1-2
タイトルA-2
タイトルB
タイトルC
問題点
maeキーとatoキーを使って条件分岐しても、titleの表の順番通りしか表示できません。
失敗:
タイトルA
タイトルB
タイトルC
タイトルA-1
タイトルA-1-1
タイトルA-1-2
タイトルA-2
ソース
list_logic.php
php
1<!DOCTYPE html> 2<html lang="ja"> 3 4<head> 5 <meta charset="UTF-8"> 6 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 7 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 8 <title>仮ページ</title> 9 10 <?php 11 12 require("./mysqlcon.php"); 13 14 $dbh = new PDO( 15 $dsn, 16 $db_user, 17 $db_password, 18 array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`") 19 ); 20 21 // タイトルのDBを習得 22 $sql = 'SELECT * FROM title'; 23 24 $stmt = $dbh->prepare($sql); 25 $stmt->execute(); 26 $depth = $stmt->fetchAll(PDO::FETCH_ASSOC); 27 ?> 28</head> 29 30<body> 31 <?php 32 foreach($depth as $val){ 33 if($val['mae'] == 0){ 34 if($val['mae'] == 0 && $val['ato'] != 0){ 35 echo $val['title_name'] . '<br>'; 36 }else{ 37 echo $val['title_name'] . '<br>'; 38 } 39 }else{ 40 echo $val['title_name'] . '<br>'; 41 } 42 43 } 44 ?> 45</body> 46 47</html>
mysqlcon.php
php
1<?php 2 //mysqlへの接続 3$dsn = 'mysql:dbname=test;host=localhost'; 4$db_user = 'root'; 5$db_password = ''; 6?>
データベース
mysql
1-- 2-- テーブルの構造 `title` 3-- 4 5CREATE TABLE `title` ( 6 `id` int(11) NOT NULL, 7 `title_name` varchar(30) NOT NULL, 8 `mae` int(11) NOT NULL, 9 `ato` int(11) NOT NULL 10) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 11 12-- 13-- テーブルのデータのダンプ `title` 14-- 15 16INSERT INTO `title` (`id`, `title_name`, `mae`, `ato`) VALUES 17(1, 'タイトルA', 0, 2), 18(2, 'タイトルB', 1, 3), 19(3, 'タイトルC', 2, 0), 20(4, 'タイトルA-1', 0, 7), 21(5, 'タイトルA-1-1', 0, 6), 22(6, 'タイトルA-1-2', 5, 0), 23(7 'タイトルA-2', 4, 0); 24 25ALTER TABLE `title` 26 ADD PRIMARY KEY (`id`); 27 28-- 29-- AUTO_INCREMENT for dumped tables 30-- 31 32-- 33-- AUTO_INCREMENT for table `title` 34-- 35ALTER TABLE `title` 36 MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8; 37COMMIT; 38
試してみたこと
php
1 <?php 2 foreach($depth as $val){ 3 if($val['mae'] == 0){ 4 if($val['mae'] == 0 && $val['ato'] != 0){ 5 echo $val['title'] . '<br>'; 6 }else{ 7 echo $val['title'] . '<br>'; 8 } 9 }else{ 10 echo $val['title'] . '<br>'; 11 } 12 13 } 14 ?>
の部分で、条件分岐を増やしても同じでした。
最後に
『mae』キーが0の時に、階層の始めを設定。『atoキー』が0の時に、階層の終わりを設定するのではないかと考えております。
ですが、それ以降、どうすれば成功例のように並び替えることが出来るかが分かりません。
皆様方のお力をお借りできればと思います。
回答2件
あなたの回答
tips
プレビュー