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

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

新規登録して質問してみよう
ただいま回答率
86.12%
PHP

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

解決済

PHP 空文字をランキングの最下層にまとめつつ、順位順、かつ、タイム順で並び替えたい

qwe001
qwe001

総合スコア129

PHP

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

1回答

0リアクション

0クリップ

136閲覧

投稿2022/10/05 09:06

編集2022/10/06 01:46

やりたいこと

  • 走行記録のCSVを読み込み、通過順位 昇順で、ランキング表示したい
  • ただし、通過順位が空欄の時は、最下位の下にまとめて表示する
    • 1->2->3->4->空欄1->空欄2->... みたいな
  • 通過順位が空欄の時、通過タイム 昇順で並び替えて表示する
    • MySQLで言うところの GROUP BY rank ORDER BY rank ASC, time ASC みたいなことがしたい
    • 通過タイムも空欄の場合がある。通過順位、通過タイムともに空欄なら、一番下に表示する
      • 難しければこれは実装不要です

CSV

csv:data/test.csv

通過順位,名前,通過タイム,区間順位,区間タイム 1,aaa,12:45*,1,12:45* 3,ccc,13:00*,3,13:00* 2,bbb,12:57*,2,12:57* 4,ddd,13:00*,4,13:00* ,xxx,15:36*,,15:36* ,vvv,14:12*,,14:12* ,yyy,18:05*,,18:05* ,zzz,,,

現在の実装

現在のループ中の通過順位($row1Rank)と次のループの通過順位($row2Rank)が同一、
または異なる時、通過タイムで比較して、数字の小さいほうを上に表示したいのですが、
どのように実装すれば良いかがわかりません

php

/** * 値の大小比較を行う * 空文字は一番下にする * * @param {Array} $row1 * @param {Array} $row2 * @return {Integer} */ function compare($row1, $row2) { $row1Rank = $row1[0]; $row2Rank = $row2[0]; $row1Time = $row1[2]; $row2Time = $row2[2]; if($row1Rank == $row2Rank) { // 空白や同一文字が連続した時 //return 0; if($row1Time == $row2Time){ return 0; } else if($row1Time == ""){ return 1; } else if($row2Rank == ""){ return -1; } return $row1Time <=> $row2Time; } else if($row1Rank == "") { return 1; } else if($row2Rank == "") { return -1; } return $row1Rank <=> $row2Rank; } usort($arr, "compare");

現在の並び順表示

1(aaa)->2(bbb)->3(ccc)->4(ddd)->(xxx)->(vvv)->(yyy)->(zzz) の順で並びます。

json

[ [ "1", "aaa", "12:45*", "1", "12:45*" ], [ "2", "bbb", "12:57*", "2", "12:57*" ], [ "3", "ccc", "13:00*", "3", "13:00*" ], [ "4", "ddd", "13:00*", "4", "13:00*" ], [ "", "xxx", "15:36*", "", "15:36*" ], [ "", "vvv", "14:12*", "", "14:12*" ], [ "", "yyy", "18:05*", "", "18:05*" ], [ "", "zzz", "", "", "" ] ]

理想の並び順表示

1(aaa)->2(bbb)->3(ccc)->4(ddd)->(vvv)->(xxx)->(yyy)->(zzz) の順で並んでほしいです
順位順かつ、タイム順で並ばせたいです

json

[ [ "1", "aaa", "12:45*", "1", "12:45*" ], [ "2", "bbb", "12:57*", "2", "12:57*" ], [ "3", "ccc", "13:00*", "3", "13:00*" ], [ "4", "ddd", "13:00*", "4", "13:00*" ], [ "", "vvv", "14:12*", "", "14:12*" ], [ "", "xxx", "15:36*", "", "15:36*" ], [ "", "yyy", "18:05*", "", "18:05*" ], [ "", "zzz", "", "", "" ] ]

困っていること

通過順位順では並びますし、通過順位が空文字の時は下にまとめて表示することもできますが、
通過順位が空文字のグループを、さらに通過タイム順で絞り込むロジックが思い浮かびません。
頭がフットーしそうです。誰か助けて :-(

環境情報

Amazon Linux2 Apache 2.4 PHP 7.4

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

適切な質問に修正を依頼しましょう。

2022/10/05 10:43依頼された後にこの質問は修正されています

こちらの質問が複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

m.ts10806

2022/10/05 10:44

>MySQLで言うところの GROUP BY rank ORDER BY rank ASC, time ASC みたいなことがしたい CSVの記録をDBに登録すれば良いのでは。
qwe001

2022/10/06 01:10

コメントありがとうございます。他社レンタルサーバを使用しますので、予算の関係でDBは使えないです。PHP側での並び替えが難しくても、最終的にフロントで見た目上、並び変われば良いのでlodash.jsなどで並び替えても良いかな、ってみてて思いました

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

PHP

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