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

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

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

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

1回答

738閲覧

変数のカラム同士を結合した上でソートをかけたい。

momolength

総合スコア62

PHP

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

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2021/06/25 05:22

編集2022/01/12 10:55

変数には配列が入っており、このうちの2カラム(例:id,start_date)を結合した値を基準に並び替えたい。

$data中身、例

array(3) { [0]=> array(3) { ["Fruit"]=> array(3) { ["id"]=> string(1) "1" ["name"]=> string(5) "名前です1" ["start_date"]=> string(10) "2021-01-01" ......... [1]=> array(3) { ["Fruit"]=> ["id"]=> string(1) "3" ["name"]=> string(5) "名前です3" ["start_date"]=> string(10) "2021-03-01" ......... [2]=> array(3) { ["Fruit"]=> ["id"]=> string(1) "2" ["name"]=> string(5) "名前です2" ["start_date"]=> string(10) "2021-02-01"

これを 12021-01-01,32021-03-01,22021-02-01とし、
12021-01-01,22021-02-01,32021-03-01と配列ごと並び替えたい。
配列のソートということでhashsortを使ってみましたが、これでは1カラムしか使えません。

$data = Hash::sort($data, '{n}.Fruit.id', 'asc');

これを idとstart_dateとすることはできませんか?
並び替えるのは大元の配列(Fruit)まとめてです。

また、他に何か関数が存在しますか?
cakephp2

-------------回答からの追記01
12021-01-01,32021-03-01,22021-02-01
を並び替えするとidの桁数が増えた時に求める結果が得られない可能性。
id + 日付ではなく、日付+id にすることで解決?
2021-01-01-1 のようにすると、完全一致の場合でも問題なさそう?
※完全一致の場合、例えば2021-01-01-1が二つある場合は、また別の処理を加えるものとするので一旦、先頭からの一致判定でいいです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/06/25 05:24

「中身」が途切れているようです。
m.ts10806

2021/06/25 05:27

>Hash::sort PHP標準にはない機能です。 定義を提示するかフレームワーク利用ならその旨明記を。
momolength

2021/06/25 05:32

>「中身」が途切れているようです。 失礼しました。大体を書きました。
退会済みユーザー

退会済みユーザー

2021/06/25 05:33

並べ替えしたいサンプルデータの提供が雑だし、2つのデータを結合してどう並べ替えするのかも示されていないので、もうちょっと丁寧な説明がほしい。
maisumakun

2021/06/25 05:33

> これを 12021-01-01,32021-03-01,22021-02-01とし、 12021-01-01,22021-02-01,32021-03-01と配列ごと並び替えたい。 idの桁数がずれても、そのまま辞書順でソートしてしまっていいのでしょうか?
momolength

2021/06/25 05:36

>idの桁数がずれても 2桁3桁になってもということでしょうか。 はい、結合した値をまとめて昇順にできればいいです。何か懸念点がありますか?
退会済みユーザー

退会済みユーザー

2021/06/25 05:38

「$data中身、例」はvar_export()による出力を基にしてくれないでしょうか、試すために文法すり合わせるのがしんどい、、
退会済みユーザー

退会済みユーザー

2021/06/25 06:29

2つのデータを結合してどう並べ替えするのか、本当にそんなやり方でほしい結果になるのか、第三者にはわからない。
guest

回答1

0

連結でソートはバグ誘発しそうですね(id=10を見て下さい)
値が完全一致したときの二次ソートの必要性はないのでしょうか?

PHP

1<?PHP 2$a=[ 3 ["id"=>"1", 4 "name"=>"名前です1", 5 "start_date"=>"2021-01-01", 6 ], 7 ["id"=>"3", 8 "name"=>"名前です3", 9 "start_date"=>"2021-03-01", 10 ], 11 ["id"=>"2", 12 "name"=>"名前です2", 13 "start_date"=>"2021-02-01", 14 ], 15 ["id"=>"10", 16 "name"=>"名前です10", 17 "start_date"=>"2021-10-01", 18 ], 19]; 20usort($a,function($x,$y){ 21 return $x["id"].$x["start_date"]<$y["id"].$y["start_date"]?-1:1; 22}); 23print_r($a);

投稿2021/06/25 05:43

yambejp

総合スコア114583

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momolength

2021/06/25 05:53 編集

なるほど。m6uさんの仰ってることが理解できました。 日付+番号の方がいいんですかね...。例えば、2021-10-01-1みたいにすると...いかがですか? それとも結合はやめて、カラムごとにソート...?そんなことできるんですかね。日付みて、idみて。をセットで行うみたいな。
yambejp

2021/06/25 05:56

日付で1次ソートして、IDを数値認識で2次ソートするとよいですよ usort($a,function($x,$y){ return $x["start_date"]==$y["start_date"]?$x["id"]-$y["id"]:($x["start_date"]<$y["start_date"]?-1:1); });
momolength

2021/06/25 06:00

ちょっとそのコードが理解できないのでこっちで流してみてみます...ありがとうございます。
yambejp

2021/06/25 06:07

ざっくり分解するとこんな感じです usort($a,function($x,$y){ if($x["start_date"]<$y["start_date"]){ return -1; //1次ソート }elseif($x["start_date"]>$y["start_date"]){ return 1; //1次ソート }else{ return $x["id"]-$y["id"];//2次ソート } });
momolength

2021/06/25 06:11

そう書いていただけると理解できましたが、最初のコードにある記号はどれが何を指しているんでしょうか。すみません初めてみたもので。
yambejp

2021/06/25 06:17 編集

よくみたら質問のソース内容を大幅にいじりましたね? 回答がズレてきているかもしれません 変な省略をするのは仕方ないとして、まっとうなデータを例示下さい
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問